diff --git a/.gitignore b/.gitignore index 1055cff6..59234960 100644 --- a/.gitignore +++ b/.gitignore @@ -12,6 +12,7 @@ BO4E-dotnet.Reporting/obj BO4E-dotnet/obj/ BO4ETestProject/bin/ +BO4ETestProject/TestResults/ BO4E-dotnet/bin/ *.manifest @@ -35,5 +36,8 @@ TestBO4E-dotnet-Reporting/obj/ TestBO4E-dotnet-Encryption/bin +TestBO4E-dotnet-Encryption/TestResults TestBO4E-dotnet-Extensions/bin +TestBO4E-dotnet-Extensions/TestResults TestBO4E-dotnet-Reporting/bin +TestBO4E-dotnet-Reporting/TestResults/ diff --git a/BO4E-dotnet.Encryption/Anonymizer.cs b/BO4E-dotnet.Encryption/Anonymizer.cs index a815f8ba..cf81c78d 100644 --- a/BO4E-dotnet.Encryption/Anonymizer.cs +++ b/BO4E-dotnet.Encryption/Anonymizer.cs @@ -8,13 +8,18 @@ using System.Security.Cryptography; using System.Security.Cryptography.X509Certificates; using System.Text; + using BO4E.BO; using BO4E.Extensions.BusinessObjects; using BO4E.meta; +using BO4E.meta.LenientConverters; + using Microsoft.CSharp.RuntimeBinder; using Microsoft.Extensions.Logging; + using Newtonsoft.Json; using Newtonsoft.Json.Linq; + using Org.BouncyCastle.Crypto; namespace BO4E.Extensions.Encryption @@ -116,10 +121,13 @@ public T ApplyOperations(BusinessObject bo) foreach (DataCategory dataCategory in mapping.Keys) { AnonymizerApproach approach = mapping[dataCategory]; - FieldInfo[] affectedFields = BoMapper.GetAnnotatedFields(bo.GetType()); - foreach (FieldInfo affectedField in affectedFields) + PropertyInfo[] affectedProps = bo.GetType().GetProperties() + .Where(p => p.GetCustomAttributes(typeof(DataCategoryAttribute), false).Length > 0) + .OrderBy(ap => ap.GetCustomAttribute()?.Order) + .ToArray(); + foreach (PropertyInfo affectedProp in affectedProps) { - if (!affectedField.IsAnonymizerRelevant(approach, dataCategory)) + if (!affectedProp.IsAnonymizerRelevant(approach, dataCategory)) { continue; } @@ -128,9 +136,9 @@ public T ApplyOperations(BusinessObject bo) case AnonymizerApproach.HASH: try { - object affectedFieldValue = affectedField.GetValue(result); + object affectedFieldValue = affectedProp.GetValue(result); HashObject(ref affectedFieldValue, dataCategory); - affectedField.SetValue(result, affectedFieldValue); + affectedProp.SetValue(result, affectedFieldValue); } catch (RuntimeBinderException e) { @@ -144,26 +152,26 @@ public T ApplyOperations(BusinessObject bo) * annotated default value, otherwise we can safely set null. */ bool isRequired = false; Attribute defaultValueAttribute = null; - Attribute jsonPropertyAttribute = affectedField.GetCustomAttributes().Where(a => a.GetType() == typeof(JsonPropertyAttribute)).FirstOrDefault(); + Attribute jsonPropertyAttribute = affectedProp.GetCustomAttributes().Where(a => a.GetType() == typeof(JsonPropertyAttribute)).FirstOrDefault(); if (jsonPropertyAttribute != null) { JsonPropertyAttribute jpa = (JsonPropertyAttribute)jsonPropertyAttribute; if (jpa.Required == Required.Always) { isRequired = true; - defaultValueAttribute = affectedField.GetCustomAttributes().Where(a => a.GetType() == typeof(DefaultValueAttribute)).FirstOrDefault(); + defaultValueAttribute = affectedProp.GetCustomAttributes().Where(a => a.GetType() == typeof(DefaultValueAttribute)).FirstOrDefault(); } } if (isRequired && defaultValueAttribute != null) { DefaultValueAttribute dva = (DefaultValueAttribute)defaultValueAttribute; - affectedField.SetValue(result, dva.Value); + affectedProp.SetValue(result, dva.Value); } else if (bo.GetType().IsSubclassOf(typeof(BO4E.BO.BusinessObject))) { // e.g. 1*Energiemenge (mappedObject)---> n*Verbrauch (boSubObject) - var boSubObject = affectedField.GetValue(bo); + var boSubObject = affectedProp.GetValue(bo); if (boSubObject != null) { try @@ -184,13 +192,13 @@ public T ApplyOperations(BusinessObject bo) { _logger.LogError($"Couldn't null BO field!: {e.Message}"); } - affectedField.SetValue(result, boSubObject); + affectedProp.SetValue(result, boSubObject); } } else { // strings, integers, elementary - affectedField.SetValue(result, null); + affectedProp.SetValue(result, null); } break; case AnonymizerApproach.ENCRYPT: @@ -200,17 +208,17 @@ public T ApplyOperations(BusinessObject bo) } using (X509AsymmetricEncrypter xasyncenc = new X509AsymmetricEncrypter(this.publicKeyX509)) { - if (affectedField.GetValue(bo).GetType() == typeof(string)) + if (affectedProp.GetValue(bo).GetType() == typeof(string)) { - if (affectedField.GetValue(bo) != null) + if (affectedProp.GetValue(bo) != null) { - affectedField.SetValue(result, xasyncenc.Encrypt(affectedField.GetValue(bo).ToString())); + affectedProp.SetValue(result, xasyncenc.Encrypt(affectedProp.GetValue(bo).ToString())); } } - else if (affectedField.GetValue(bo).GetType().IsSubclassOf(typeof(BO4E.COM.COM))) + else if (affectedProp.GetValue(bo).GetType().IsSubclassOf(typeof(BO4E.COM.COM))) { - var comObject = affectedField.GetValue(bo); - dynamic comFields = comObject.GetType().GetFields(); + var comObject = affectedProp.GetValue(bo); + dynamic comFields = comObject.GetType().GetProperties(); foreach (dynamic comField in comFields) { try @@ -228,21 +236,21 @@ public T ApplyOperations(BusinessObject bo) _logger.LogError($"Couldn't encrypt COM field!: {f.Message}"); } } - affectedField.SetValue(result, comObject); + affectedProp.SetValue(result, comObject); } - else if (affectedField.FieldType.IsSubclassOf(typeof(BO4E.BO.BusinessObject))) + else if (affectedProp.PropertyType.IsSubclassOf(typeof(BO4E.BO.BusinessObject))) { - affectedField.SetValue(result, xasyncenc.Encrypt((BusinessObject)affectedField.GetValue(bo))); + affectedProp.SetValue(result, xasyncenc.Encrypt((BusinessObject)affectedProp.GetValue(bo))); } - else if (affectedField.FieldType.ToString().StartsWith("BO4E.ENUM")) // todo: check for namespace instead of strinyfied comparison + else if (affectedProp.PropertyType.ToString().StartsWith("BO4E.ENUM")) // todo: check for namespace instead of strinyfied comparison { //affectedField.SetValue(mappedObject, Sha256HashEnum(affectedField.GetValue(mappedObject).ToString())); - _logger.LogWarning($"Encrypting {affectedField.FieldType} is not supported, since the result would not be a valid ENUM value."); + _logger.LogWarning($"Encrypting {affectedProp.PropertyType} is not supported, since the result would not be a valid ENUM value."); //throw new NotSupportedException($"Hashing {affectedField.FieldType} is not supported, since the result would not be a valid ENUM value."); } else { - throw new NotImplementedException($"Encrypting {affectedField.FieldType} is not implemented yet."); + throw new NotImplementedException($"Encrypting {affectedProp.PropertyType} is not implemented yet."); } } break; @@ -253,7 +261,7 @@ public T ApplyOperations(BusinessObject bo) } using (X509AsymmetricEncrypter xasydec = new X509AsymmetricEncrypter(this.privateKey)) { - affectedField.SetValue(result, xasydec.Decrypt(affectedField.GetValue(bo).ToString())); + affectedProp.SetValue(result, xasydec.Decrypt(affectedProp.GetValue(bo).ToString())); } continue; case AnonymizerApproach.KEEP: @@ -336,25 +344,25 @@ protected void HashObject(ref object input, DataCategory? dataCategory = null) } else { - var fields = inputType.GetFields(); - foreach (var field in fields) + var properties = inputType.GetProperties(); + foreach (var prop in properties) { - if (field.GetValue(input) == null || !field.IsHashingRelevant(dataCategory)) + if (prop.GetValue(input) == null || !prop.IsHashingRelevant(dataCategory)) { continue; } try { - object o = field.GetValue(input); + object o = prop.GetValue(input); HashObject(ref o, dataCategory); - field.SetValue(input, o); + prop.SetValue(input, o); } catch (Exception f) { - throw new ArgumentException($"Couldn't hash field {field.Name}: {f.Message}"); + throw new ArgumentException($"Couldn't hash field {prop.Name}: {f.Message}"); } } - if (fields.Count() == 0) + if (properties.Count() == 0) { throw new NotImplementedException($"Type {inputType} with value '{input}' has no subfields but is not handled separately."); } @@ -415,28 +423,28 @@ protected void HashString(ref string input, DataCategory? dataCategory) /// true if the fulfills the requirements of a hashed key public static bool HasHashedKey(Marktlokation ma) { - return !string.IsNullOrWhiteSpace(ma.marktlokationsId) && ma.marktlokationsId.StartsWith(HASHED_MARKTLOKATION_PREFIX); + return !string.IsNullOrWhiteSpace(ma.MarktlokationsId) && ma.MarktlokationsId.StartsWith(HASHED_MARKTLOKATION_PREFIX); } /// /// check if a Messlokation has been pseudonymized using /// As of 2019 it's impossible for a "real" Messlokation to fulfill this condition. /// /// Messlokation - /// true if the fulfills the requirements of a hashed key + /// true if the fulfills the requirements of a hashed key public static bool HasHashedKey(Messlokation me) { - return !string.IsNullOrWhiteSpace(me.messlokationsId) && me.messlokationsId.StartsWith(HASHED_MESSLOKATION_PREFIX); + return !string.IsNullOrWhiteSpace(me.MesslokationsId) && me.MesslokationsId.StartsWith(HASHED_MESSLOKATION_PREFIX); } /// /// check if an Energiemenge been pseudonymized using . - /// Calls for . + /// Calls for . /// /// Energiemenge - /// true if the fulfills the requirements of a hashed key + /// true if the fulfills the requirements of a hashed key public static bool HasHashedKey(Energiemenge em) { - return IsHashedKey(em.lokationsId); + return IsHashedKey(em.LokationsId); } /// diff --git a/BO4E-dotnet.Encryption/AnonymizerConfiguration.cs b/BO4E-dotnet.Encryption/AnonymizerConfiguration.cs index 038fddf7..b9cef91f 100644 --- a/BO4E-dotnet.Encryption/AnonymizerConfiguration.cs +++ b/BO4E-dotnet.Encryption/AnonymizerConfiguration.cs @@ -19,7 +19,7 @@ public class AnonymizerConfiguration public Dictionary operations { get; private set; } /// - /// set of key in / that should not be affected by the anonymizing operations + /// set of key in / that should not be affected by the anonymizing operations /// [JsonProperty(Required = Required.Default)] public HashSet unaffectedUserProperties; diff --git a/BO4E-dotnet.Encryption/AsymmetricEncrypter.cs b/BO4E-dotnet.Encryption/AsymmetricEncrypter.cs index 58572470..fd4eb741 100644 --- a/BO4E-dotnet.Encryption/AsymmetricEncrypter.cs +++ b/BO4E-dotnet.Encryption/AsymmetricEncrypter.cs @@ -1,8 +1,10 @@ using System; using System.Text; + using BO4E.BO; + using Newtonsoft.Json; -using Newtonsoft.Json.Linq; + using Sodium; namespace BO4E.Extensions.Encryption @@ -19,8 +21,10 @@ public class AsymmetricEncrypter : Encrypter /// public key public AsymmetricEncrypter(byte[] privateKey, byte[] publicKey) { - this.privateKey = privateKey; - this.ownPublicKey = publicKey; + this.ownPublicKey = new byte[publicKey.Length]; + this.privateKey = new byte[privateKey.Length]; + privateKey.CopyTo(this.privateKey, 0); + publicKey.CopyTo(this.ownPublicKey, 0); } /// /// Instantiate with private and public key @@ -105,10 +109,21 @@ public override BusinessObject Decrypt(EncryptedObject encryptedObject) { return null; } - string plainString = Decrypt(eo.cipherText, eo.publicKey, eo.nonce); + string plainString = Decrypt(eo.CipherText, eo.PublicKey, eo.Nonce); return JsonConvert.DeserializeObject(plainString); } + public override T Decrypt(EncryptedObject encryptedObject) + { + EncryptedObjectPublicKeyBox eo = (EncryptedObjectPublicKeyBox)(encryptedObject);// (EncryptedObjectPublicKeyBox)BoMapper.MapObject("EncryptedObjectPublicKeyBox", JObject.FromObject(encryptedObject)); + if (eo == null) + { + return (T)null; + } + string plainString = Decrypt(eo.CipherText, eo.PublicKey, eo.Nonce); + return JsonConvert.DeserializeObject(plainString); + } + public override void Dispose() { if (privateKey != null) diff --git a/BO4E-dotnet.Encryption/BO4E-dotnet.Extensions.Encryption.csproj b/BO4E-dotnet.Encryption/BO4E-dotnet.Extensions.Encryption.csproj index ff7d0f5f..c34ffc58 100644 --- a/BO4E-dotnet.Encryption/BO4E-dotnet.Extensions.Encryption.csproj +++ b/BO4E-dotnet.Encryption/BO4E-dotnet.Extensions.Encryption.csproj @@ -11,6 +11,7 @@ Hochfrequenz.BO4E.Extensions.Encryption Hochfrequenz Unternehmensberatung GmbH + 0.2.0 diff --git a/BO4E-dotnet.Encryption/EncryptedObject.cs b/BO4E-dotnet.Encryption/EncryptedObject.cs index 3d4ad641..ea5d3c18 100644 --- a/BO4E-dotnet.Encryption/EncryptedObject.cs +++ b/BO4E-dotnet.Encryption/EncryptedObject.cs @@ -17,16 +17,16 @@ public abstract class EncryptedObject : BusinessObject /// /// encryption scheme used /// - [JsonProperty(Required = Required.Always, Order = 7)] + [JsonProperty(PropertyName = "encryptionScheme", Required = Required.Always, Order = 7)] [BoKey] - public EncryptionScheme encryptionScheme; + public EncryptionScheme EncryptionScheme { get; set; } /// /// base64 encoded cipher text of the original objects JSON serialisation /// - [JsonProperty(Required = Required.Always, Order = 8)] + [JsonProperty(PropertyName = "cipherText", Required = Required.Always, Order = 8)] [BoKey] - public string cipherText; + public string CipherText { get; set; } /// /// create a new EncryptedObject instance by providing both @@ -35,8 +35,8 @@ public abstract class EncryptedObject : BusinessObject /// the encryption scheme public EncryptedObject(string _cipherText, EncryptionScheme es) : base() { - this.cipherText = _cipherText; - this.encryptionScheme = es; + this.CipherText = _cipherText; + this.EncryptionScheme = es; } } } diff --git a/BO4E-dotnet.Encryption/EncryptedObjectAEAD.cs b/BO4E-dotnet.Encryption/EncryptedObjectAEAD.cs index 0c1c0a35..fd290036 100644 --- a/BO4E-dotnet.Encryption/EncryptedObjectAEAD.cs +++ b/BO4E-dotnet.Encryption/EncryptedObjectAEAD.cs @@ -1,4 +1,5 @@ using BO4E.ENUM; + using Newtonsoft.Json; namespace BO4E.BO @@ -13,20 +14,20 @@ public class EncryptedObjectAEAD : EncryptedObject /// unique nonce / initialisation vector (base 64 encoded, must not be used twice) public EncryptedObjectAEAD(string cipherText, string associatedData, string nonce) : base(cipherText, EncryptionScheme.SodiumSymmetricAEAD) { - this.associatedData = associatedData; - this.nonce = nonce; + this.AssociatedData = associatedData; + this.Nonce = nonce; } /// /// base64 encoded unique nonce / initialisation vector /// - [JsonProperty(Required = Required.Always, Order = 8)] - public string nonce; + [JsonProperty(PropertyName = "nonce", Required = Required.Always, Order = 8)] + public string Nonce { get; set; } /// /// associated data string (UTF-8); might be an empty string but not null /// - [JsonProperty(Required = Required.Always, Order = 5)] - public string associatedData; + [JsonProperty(PropertyName = "AssociatedData", Required = Required.Always, Order = 5)] + public string AssociatedData { get; set; } } } diff --git a/BO4E-dotnet.Encryption/EncryptedObjectPKCS7.cs b/BO4E-dotnet.Encryption/EncryptedObjectPKCS7.cs index f35f1ff5..e8863b14 100644 --- a/BO4E-dotnet.Encryption/EncryptedObjectPKCS7.cs +++ b/BO4E-dotnet.Encryption/EncryptedObjectPKCS7.cs @@ -1,5 +1,7 @@ using System.Collections.Generic; + using BO4E.ENUM; + using Newtonsoft.Json; @@ -14,13 +16,13 @@ public class EncryptedObjectPKCS7 : EncryptedObject /// list of public keys for which the object is decrypt-able public EncryptedObjectPKCS7(string cipherText, List publicKeys) : base(cipherText, EncryptionScheme.BouncyCastleCMS) { - this.publicKeys = publicKeys; + this.PublicKeys = publicKeys; } /// /// list of public keys for which the object is decrypt-able /// - [JsonProperty(Required = Required.Default)] - public List publicKeys; + [JsonProperty(PropertyName = "publicKeys", Required = Required.Default)] + public List PublicKeys { get; set; } } } diff --git a/BO4E-dotnet.Encryption/EncryptedObjectPublicKeyBox.cs b/BO4E-dotnet.Encryption/EncryptedObjectPublicKeyBox.cs index d32229b8..1b14d9ec 100644 --- a/BO4E-dotnet.Encryption/EncryptedObjectPublicKeyBox.cs +++ b/BO4E-dotnet.Encryption/EncryptedObjectPublicKeyBox.cs @@ -1,4 +1,5 @@ using BO4E.ENUM; + using Newtonsoft.Json; namespace BO4E.BO @@ -16,20 +17,20 @@ public class EncryptedObjectPublicKeyBox : EncryptedObject /// unique nonce / initialisation vector (base 64 encoded, must not be used twice) public EncryptedObjectPublicKeyBox(string cipherText, string publicKey, string nonce) : base(cipherText, EncryptionScheme.SodiumAsymmetricPublicKeyBox) { - this.publicKey = publicKey; - this.nonce = nonce; + this.PublicKey = publicKey; + this.Nonce = nonce; } /// /// Base64 encoded unique nonce / initialisation vector (IV) /// - [JsonProperty(Required = Required.Always, Order = 8)] - public string nonce; + [JsonProperty(PropertyName = "nonce", Required = Required.Always, Order = 8)] + public string Nonce { get; set; } /// /// base64 encoded public key of the message sender /// - [JsonProperty(Required = Required.Always, Order = 5)] - public string publicKey; + [JsonProperty(PropertyName = "publicKey", Required = Required.Always, Order = 5)] + public string PublicKey { get; set; } } } diff --git a/BO4E-dotnet.Encryption/Encrypter.cs b/BO4E-dotnet.Encryption/Encrypter.cs index 7babee36..3dcd5c6b 100644 --- a/BO4E-dotnet.Encryption/Encrypter.cs +++ b/BO4E-dotnet.Encryption/Encrypter.cs @@ -1,5 +1,7 @@ using System; + using BO4E.BO; + using Microsoft.Extensions.Logging; namespace BO4E.Extensions.Encryption @@ -16,6 +18,7 @@ public abstract class Encrypter : IDisposable /// an encrypted Business Object /// a decrypted Business Object public abstract BusinessObject Decrypt(EncryptedObject encryptedObject); + public abstract T Decrypt(EncryptedObject encryptedObject) where T : BusinessObject; public abstract void Dispose(); ~Encrypter() diff --git a/BO4E-dotnet.Encryption/FieldInfoExtensions.cs b/BO4E-dotnet.Encryption/FieldInfoExtensions.cs index fc8f8fd1..b2c70999 100644 --- a/BO4E-dotnet.Encryption/FieldInfoExtensions.cs +++ b/BO4E-dotnet.Encryption/FieldInfoExtensions.cs @@ -8,37 +8,37 @@ namespace BO4E.Extensions.Encryption { internal static class FieldInfoExtensions { - internal static bool IsAnonymizerRelevant(this FieldInfo field, AnonymizerApproach approach, DataCategory? dataCategory) + internal static bool IsAnonymizerRelevant(this PropertyInfo prop, AnonymizerApproach approach, DataCategory? dataCategory) { switch (approach) { case AnonymizerApproach.DELETE: - return field.IsDeletionRelevant(dataCategory); + return prop.IsDeletionRelevant(dataCategory); case AnonymizerApproach.HASH: - return field.IsHashingRelevant(dataCategory); + return prop.IsHashingRelevant(dataCategory); case AnonymizerApproach.ENCRYPT: case AnonymizerApproach.DECRYPT: - return field.IsEncryptionRelevant(dataCategory); + return prop.IsEncryptionRelevant(dataCategory); case AnonymizerApproach.KEEP: default: return false; } } - internal static bool IsHashingRelevant(this FieldInfo field, DataCategory? dataCategory) + internal static bool IsHashingRelevant(this PropertyInfo property, DataCategory? dataCategory) { - if (field.FieldType.IsSubclassOf(typeof(BO4E.COM.COM)) || field.FieldType.IsSubclassOf(typeof(BO4E.BO.BusinessObject))) + if (property.PropertyType.IsSubclassOf(typeof(BO4E.COM.COM)) || property.PropertyType.IsSubclassOf(typeof(BO4E.BO.BusinessObject))) { return true; } - else if (field.FieldType.IsGenericType && field.FieldType.GetGenericTypeDefinition() == typeof(List<>)) + else if (property.PropertyType.IsGenericType && property.PropertyType.GetGenericTypeDefinition() == typeof(List<>)) { - var listElementType = field.FieldType.GetGenericArguments()[0]; + var listElementType = property.PropertyType.GetGenericArguments()[0]; return listElementType.IsSubclassOf(typeof(BO4E.COM.COM)) || listElementType.IsSubclassOf(typeof(BO4E.BO.BusinessObject)); } else if (dataCategory.HasValue) { - foreach (Attribute attribute in field.GetCustomAttributes().Where(a => a.GetType() == typeof(DataCategoryAttribute))) + foreach (Attribute attribute in property.GetCustomAttributes().Where(a => a.GetType() == typeof(DataCategoryAttribute))) { DataCategoryAttribute dataCatagoryAttribute = (DataCategoryAttribute)attribute; if (!dataCatagoryAttribute.Mapping.Contains(dataCategory.Value)) @@ -51,15 +51,15 @@ internal static bool IsHashingRelevant(this FieldInfo field, DataCategory? dataC return false; } - internal static bool IsEncryptionRelevant(this FieldInfo field, DataCategory? dataCategory) + internal static bool IsEncryptionRelevant(this PropertyInfo property, DataCategory? dataCategory) { - if (field.FieldType.IsSubclassOf(typeof(BO4E.COM.COM)) || field.FieldType.IsSubclassOf(typeof(BO4E.BO.BusinessObject)) || field.FieldType.IsEnum) + if (property.PropertyType.IsSubclassOf(typeof(BO4E.COM.COM)) || property.PropertyType.IsSubclassOf(typeof(BO4E.BO.BusinessObject)) || property.PropertyType.IsEnum) { return false; // not yet supported for encryption } if (dataCategory.HasValue) { - foreach (Attribute attribute in field.GetCustomAttributes().Where(a => a.GetType() == typeof(DataCategoryAttribute))) + foreach (Attribute attribute in property.GetCustomAttributes().Where(a => a.GetType() == typeof(DataCategoryAttribute))) { DataCategoryAttribute dataCatagoryAttribute = (DataCategoryAttribute)attribute; if (!dataCatagoryAttribute.Mapping.Contains(dataCategory.Value)) @@ -72,15 +72,15 @@ internal static bool IsEncryptionRelevant(this FieldInfo field, DataCategory? da return false; } - internal static bool IsDeletionRelevant(this FieldInfo field, DataCategory? dataCategory) + internal static bool IsDeletionRelevant(this PropertyInfo property, DataCategory? dataCategory) { - if (field.FieldType.IsEnum) + if (property.PropertyType.IsEnum) { return false; } if (dataCategory.HasValue) { - foreach (Attribute attribute in field.GetCustomAttributes().Where(a => a.GetType() == typeof(DataCategoryAttribute))) + foreach (Attribute attribute in property.GetCustomAttributes().Where(a => a.GetType() == typeof(DataCategoryAttribute))) { DataCategoryAttribute dataCatagoryAttribute = (DataCategoryAttribute)attribute; if (!dataCatagoryAttribute.Mapping.Contains(dataCategory.Value)) diff --git a/BO4E-dotnet.Encryption/SymmetricEncrypter.cs b/BO4E-dotnet.Encryption/SymmetricEncrypter.cs index c91a3bde..6385cf42 100644 --- a/BO4E-dotnet.Encryption/SymmetricEncrypter.cs +++ b/BO4E-dotnet.Encryption/SymmetricEncrypter.cs @@ -1,8 +1,10 @@ using System; using System.Text; + using BO4E.BO; + using Newtonsoft.Json; -using Newtonsoft.Json.Linq; + using Sodium; namespace BO4E.Extensions.Encryption @@ -17,7 +19,8 @@ public class SymmetricEncrypter : Encrypter /// secret key public SymmetricEncrypter(byte[] secretKey) { - this.secretKey = secretKey; + this.secretKey = new byte[secretKey.Length]; + secretKey.CopyTo(this.secretKey, 0); } /// /// pass the secret key as base64 encoded string to the constructor @@ -36,7 +39,7 @@ private string Encrypt(string plainText, string associatedDataString, byte[] non { byte[] plainBytes = Encoding.UTF8.GetBytes(plainText); byte[] adBytes = Encoding.UTF8.GetBytes(associatedDataString); - byte[] cipherBytes = SecretAead.Encrypt(plainBytes, nonce, secretKey, adBytes); + byte[] cipherBytes = SecretAeadChaCha20Poly1305.Encrypt(plainBytes, nonce, secretKey, adBytes); string cipherString = Convert.ToBase64String(cipherBytes); return cipherString; } @@ -49,7 +52,7 @@ private string Encrypt(string plainText, string associatedDataString, byte[] non /// Tuple of (cipherText, nonce); both as base64 encoded string public (string, string) Encrypt(string plainText, string associatedDataString) { - byte[] nonce = SecretAead.GenerateNonce(); + byte[] nonce = SecretAeadChaCha20Poly1305.GenerateNonce(); return (Encrypt(plainText, associatedDataString, nonce), Convert.ToBase64String(nonce)); } @@ -62,7 +65,7 @@ private string Encrypt(string plainText, string associatedDataString, byte[] non public EncryptedObjectAEAD Encrypt(BusinessObject plainObject, string associatedDataString) { string plainText = JsonConvert.SerializeObject(plainObject); - byte[] nonce = SecretAead.GenerateNonce(); + byte[] nonce = SecretAeadChaCha20Poly1305.GenerateNonce(); string cipherString = Encrypt(plainText, associatedDataString, nonce); return new EncryptedObjectAEAD(cipherString, associatedDataString, Convert.ToBase64String(nonce)); } @@ -77,7 +80,7 @@ private string Decrypt(string cipherText, string associatedDataString, byte[] no { byte[] cipherBytes = Convert.FromBase64String(cipherText); byte[] adBytes = Encoding.UTF8.GetBytes(associatedDataString); - byte[] plainBytes = SecretAead.Decrypt(cipherBytes, nonce, secretKey, adBytes); + byte[] plainBytes = SecretAeadChaCha20Poly1305.Decrypt(cipherBytes, nonce, secretKey, adBytes); return Encoding.UTF8.GetString(plainBytes); } @@ -95,10 +98,21 @@ public override BusinessObject Decrypt(EncryptedObject encryptedObject) { return null; } - string plainString = Decrypt(eo.cipherText, eo.associatedData, eo.nonce); + string plainString = Decrypt(eo.CipherText, eo.AssociatedData, eo.Nonce); return JsonConvert.DeserializeObject(plainString); } + public override T Decrypt(EncryptedObject encryptedObject) + { + EncryptedObjectAEAD eo = (EncryptedObjectAEAD)encryptedObject; + if (eo == null) + { + return (T)null; + } + string plainString = Decrypt(eo.CipherText, eo.AssociatedData, eo.Nonce); + return JsonConvert.DeserializeObject(plainString); + } + public override void Dispose() { if (secretKey != null) diff --git a/BO4E-dotnet.Encryption/X509AsymmetricEncrypter.cs b/BO4E-dotnet.Encryption/X509AsymmetricEncrypter.cs index 084bed3a..35667cfd 100644 --- a/BO4E-dotnet.Encryption/X509AsymmetricEncrypter.cs +++ b/BO4E-dotnet.Encryption/X509AsymmetricEncrypter.cs @@ -4,8 +4,11 @@ using System.IO; using System.Security.Cryptography.X509Certificates; using System.Text; + using BO4E.BO; + using Newtonsoft.Json; + using Org.BouncyCastle.Cms; using Org.BouncyCastle.Crypto; using Org.BouncyCastle.OpenSsl; @@ -96,14 +99,7 @@ public string Decrypt(string cipherText) { byte[] cipherBytes = Convert.FromBase64String(cipherText); CmsEnvelopedData envelopedData; - try - { - envelopedData = new CmsEnvelopedData(cipherBytes); - }catch(Exception e) - { - int a = 0; - throw e; - } + envelopedData = new CmsEnvelopedData(cipherBytes); RecipientInformationStore recipientsStore = envelopedData.GetRecipientInfos(); ICollection recipientsCollection = recipientsStore.GetRecipients(); IList recipients = recipientsCollection as IList; @@ -148,10 +144,20 @@ public override BusinessObject Decrypt(EncryptedObject encryptedObject) { return null; } - string plainString = Decrypt(eo.cipherText); + string plainString = Decrypt(eo.CipherText); return JsonConvert.DeserializeObject(plainString); } + public override T Decrypt(EncryptedObject encryptedObject) + { + if (!(encryptedObject is EncryptedObjectPKCS7 eo)) + { + return (T)null; + } + string plainString = Decrypt(eo.CipherText); + return JsonConvert.DeserializeObject(plainString); + } + public override void Dispose() { this.privateKey = null; diff --git a/BO4E-dotnet.Extensions/BO4E-dotnet.Extensions.csproj b/BO4E-dotnet.Extensions/BO4E-dotnet.Extensions.csproj index 61e369fe..2af68842 100644 --- a/BO4E-dotnet.Extensions/BO4E-dotnet.Extensions.csproj +++ b/BO4E-dotnet.Extensions/BO4E-dotnet.Extensions.csproj @@ -10,6 +10,7 @@ https://github.com/HFInnovation/BO4E-dotnet/ Hochfrequenz.BO4E.Extensions Hochfrequenz Unternehmensberatung GmbH + 0.2.0 diff --git a/BO4E-dotnet.Extensions/BusinessObjects/Benachrichtigung/BenachrichtigungExtension.cs b/BO4E-dotnet.Extensions/BusinessObjects/Benachrichtigung/BenachrichtigungExtension.cs index eb481945..7c30c6bf 100644 --- a/BO4E-dotnet.Extensions/BusinessObjects/Benachrichtigung/BenachrichtigungExtension.cs +++ b/BO4E-dotnet.Extensions/BusinessObjects/Benachrichtigung/BenachrichtigungExtension.cs @@ -2,8 +2,8 @@ using System.Collections.Generic; using System.ComponentModel; using System.Linq; + using Newtonsoft.Json.Linq; -using BO4E.BO; namespace BO4E.Extensions.BusinessObjects.Benachrichtigung { @@ -21,8 +21,8 @@ public static bool Has(this BO4E.BO.Benachrichtigung b, string key, string value { return Has(b, new BO4E.COM.GenericStringStringInfo() { - keyColumn = key, - value = value + KeyColumn = key, + Value = value }); } @@ -34,12 +34,12 @@ public static bool Has(this BO4E.BO.Benachrichtigung b, string key, string value /// public static bool Has(this BO4E.BO.Benachrichtigung b, BO4E.COM.GenericStringStringInfo gssi) { - if (b.infos == null || b.infos.Count == 0) + if (b.Infos == null || b.Infos.Count == 0) { return false; } // ToDo fr Hamid: Bitte prfen, warum Contains false zurckliefert. - return (b.infos.Where(m => m.keyColumn == gssi.keyColumn && m.value == gssi.value).Count() > 0); + return (b.Infos.Where(m => m.KeyColumn == gssi.KeyColumn && m.Value == gssi.Value).Count() > 0); } /// @@ -50,11 +50,11 @@ public static bool Has(this BO4E.BO.Benachrichtigung b, BO4E.COM.GenericStringSt /// true if key is in public static bool Has(this BO4E.BO.Benachrichtigung b, string key) { - if (b.infos == null || b.infos.Count == 0) + if (b.Infos == null || b.Infos.Count == 0) { return false; } - return (b.infos.Where(gssi => gssi.keyColumn == key).Count() > 0); + return (b.Infos.Where(gssi => gssi.KeyColumn == key).Count() > 0); } /// @@ -73,7 +73,7 @@ public static bool Has(this BO4E.BO.Benachrichtigung b, string keyName, Predi { return passByDefault; } - foreach (var info in b.infos.Where(gssi => gssi.keyColumn == keyName)) + foreach (var info in b.Infos.Where(gssi => gssi.KeyColumn == keyName)) { try { @@ -83,7 +83,7 @@ public static bool Has(this BO4E.BO.Benachrichtigung b, string keyName, Predi } if (typeConverter != null) { - T value = (T)typeConverter.ConvertFromString(info.value); + T value = (T)typeConverter.ConvertFromString(info.Value); return predicate(value); } continue; @@ -97,28 +97,28 @@ public static bool Has(this BO4E.BO.Benachrichtigung b, string keyName, Predi } /// - /// moves key value pairs from to for more conventient handling. + /// moves key value pairs from to for more conventient handling. /// /// Benachrichtigung /// set true to overwrite userProperties with same key // ToDo: make method generic MoveInfosTouserProperties(...) public static void MoveInfosToUserProperties(this BO4E.BO.Benachrichtigung b, bool overwriteExistingKeys = false) { - if (b.infos != null && b.infos.Count > 0) + if (b.Infos != null && b.Infos.Count > 0) { - if (b.userProperties == null) + if (b.UserProperties == null) { - b.userProperties = new Dictionary(); + b.UserProperties = new Dictionary(); } - foreach (var info in b.infos) + foreach (var info in b.Infos) { - if (b.userProperties.ContainsKey(info.keyColumn) && overwriteExistingKeys) + if (b.UserProperties.ContainsKey(info.KeyColumn) && overwriteExistingKeys) { - b.userProperties.Remove(info.keyColumn); + b.UserProperties.Remove(info.KeyColumn); } - b.userProperties.Add(info.keyColumn, info.value); // might throw exception if key exists and !overwriteExistingKeys. That's ok. + b.UserProperties.Add(info.KeyColumn, info.Value); // might throw exception if key exists and !overwriteExistingKeys. That's ok. } - b.infos = null; // set to null after all elements have been moved + b.Infos = null; // set to null after all elements have been moved } } } diff --git a/BO4E-dotnet.Extensions/BusinessObjects/Energiemenge/EnergiemengeExtension.cs b/BO4E-dotnet.Extensions/BusinessObjects/Energiemenge/EnergiemengeExtension.cs index 203c59ae..9b3af087 100644 --- a/BO4E-dotnet.Extensions/BusinessObjects/Energiemenge/EnergiemengeExtension.cs +++ b/BO4E-dotnet.Extensions/BusinessObjects/Energiemenge/EnergiemengeExtension.cs @@ -2,14 +2,19 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; + using BO4E.COM; using BO4E.ENUM; using BO4E.Extensions.COM; using BO4E.Extensions.ENUM; using BO4E.Reporting; + using Itenso.TimePeriod; + using Newtonsoft.Json.Linq; + using StackExchange.Profiling; + using static BO4E.Extensions.COM.VerbrauchExtension; @@ -24,15 +29,15 @@ public static partial class EnergiemengeExtension /// Get Zeitraum covered by Energiemenge. /// /// Energiemenge - /// Zeitraum ranging from the earliest to the latest + /// Zeitraum ranging from the earliest to the latest public static Zeitraum GetZeitraum(this BO4E.BO.Energiemenge menge) { using (MiniProfiler.Current.Step(nameof(GetZeitraum))) { Zeitraum zeitraum = new Zeitraum { - startdatum = GetMinDate(menge), - enddatum = GetMaxDate(menge) + Startdatum = GetMinDate(menge), + Enddatum = GetMaxDate(menge) }; return zeitraum; } @@ -42,7 +47,7 @@ public static Zeitraum GetZeitraum(this BO4E.BO.Energiemenge menge) /// Get TimeRange covery by Energiemenge /// /// Energiemenge - /// TimeRange ranging from the earliest to the latest + /// TimeRange ranging from the earliest to the latest /// public static TimeRange GetTimeRange(this BO4E.BO.Energiemenge menge) { @@ -66,7 +71,7 @@ private static DateTime GetMinDate(this BO4E.BO.Energiemenge em) { using (MiniProfiler.Current.Step(nameof(GetMinDate))) { - return em.energieverbrauch.Min(ev => ev.startdatum); // don't catch! + return em.Energieverbrauch.Min(ev => ev.Startdatum); // don't catch! } } @@ -74,7 +79,7 @@ private static DateTime GetMaxDate(this BO4E.BO.Energiemenge em) { using (MiniProfiler.Current.Step(nameof(GetMinDate))) { - return em.energieverbrauch.Max(ev => ev.enddatum); // don't catch! + return em.Energieverbrauch.Max(ev => ev.Enddatum); // don't catch! } } @@ -117,19 +122,19 @@ public static Tuple GetConsumption(this BO4E.BO.Energiem { throw new ArgumentException("The Energiemenge is not pure."); } - if (em.energieverbrauch.Count == 0) + if (em.Energieverbrauch.Count == 0) { return Tuple.Create(0.0M, Mengeneinheit.ANZAHL); } - ISet einheiten = new HashSet(em.energieverbrauch.Select(x => x.einheit)); + ISet einheiten = new HashSet(em.Energieverbrauch.Select(x => x.Einheit)); if (einheiten.Count > 1) { // z.B. kWh und Wh oder Monat und Jahr... Die liefern IsPure==true. throw new NotImplementedException("Converting different units of same type is not supported yet."); } - Verbrauch v = em.energieverbrauch.First(); - decimal consumption = em.GetConsumption(reference, v.wertermittlungsverfahren, v.obiskennzahl, v.einheit); - return Tuple.Create(consumption, v.einheit); + Verbrauch v = em.Energieverbrauch.First(); + decimal consumption = em.GetConsumption(reference, v.Wertermittlungsverfahren, v.Obiskennzahl, v.Einheit); + return Tuple.Create(consumption, v.Einheit); } } @@ -149,10 +154,10 @@ public static decimal GetConsumption(this BO4E.BO.Energiemenge em, ITimeRange re { throw new ArgumentException($"The Mengeneinheit {me} isn't extensive. Calculating a consumption doesn't make sense."); } - return em.energieverbrauch - .Where(v => v.wertermittlungsverfahren == wev && v.obiskennzahl == obiskennzahl && v.einheit == me) + return em.Energieverbrauch + .Where(v => v.Wertermittlungsverfahren == wev && v.Obiskennzahl == obiskennzahl && v.Einheit == me) //.AsParallel() - .Sum(v => GetOverlapFactor(new TimeRange(v.startdatum, v.enddatum), reference, false) * v.wert); + .Sum(v => GetOverlapFactor(new TimeRange(v.Startdatum, v.Enddatum), reference, false) * v.Wert); } /// @@ -183,9 +188,9 @@ public static BO4E.BO.Energiemenge Normalise(this BO4E.BO.Energiemenge em, decim } using (MiniProfiler.Current.Step("Parallelised normalising of all values.")) { - Parallel.ForEach(result.energieverbrauch.Where(v => v.einheit == totalConsumption.Item2), v => + Parallel.ForEach(result.Energieverbrauch.Where(v => v.Einheit == totalConsumption.Item2), v => { - v.wert = scalingFactor * v.wert; + v.Wert = scalingFactor * v.Wert; }); } return result; @@ -206,15 +211,15 @@ public static BO4E.BO.Energiemenge Normalise(this BO4E.BO.Energiemenge em, decim throw new ArgumentException($"The Mengeneinheit {me} isn't intensive. Calculating the value for a specific point in time doesn't make sense."); } decimal? result = null; - foreach (Verbrauch v in em.energieverbrauch.Where(v => v.startdatum <= dt && dt < v.enddatum)) + foreach (Verbrauch v in em.Energieverbrauch.Where(v => v.Startdatum <= dt && dt < v.Enddatum)) { if (result.HasValue) { - result += v.wert; + result += v.Wert; } else { - result = v.wert; + result = v.Wert; } } return result; @@ -233,14 +238,14 @@ public static BO4E.BO.Energiemenge Normalise(this BO4E.BO.Energiemenge em, decim { throw new ArgumentException("Energiemenge is not pure."); } - else if (em.energieverbrauch.Count == 0) + else if (em.Energieverbrauch.Count == 0) { return Tuple.Create(null, Mengeneinheit.KW); } else { - Verbrauch v = em.energieverbrauch.First(); - return Tuple.Create(em.GetAverage(v.wertermittlungsverfahren, v.obiskennzahl, v.einheit), v.einheit); + Verbrauch v = em.Energieverbrauch.First(); + return Tuple.Create(em.GetAverage(v.Wertermittlungsverfahren, v.Obiskennzahl, v.Einheit), v.Einheit); } } @@ -272,16 +277,16 @@ public static BO4E.BO.Energiemenge Normalise(this BO4E.BO.Energiemenge em, decim { decimal? result = null; decimal overallDenominator = 0.0M; - foreach (Verbrauch v in em.energieverbrauch.Where(v => v.einheit == me)) + foreach (Verbrauch v in em.Energieverbrauch.Where(v => v.Einheit == me)) { - decimal overlapFactor = GetOverlapFactor(new TimeRange(v.startdatum, v.enddatum), reference, true); + decimal overlapFactor = GetOverlapFactor(new TimeRange(v.Startdatum, v.Enddatum), reference, true); if (result.HasValue) { - result += overlapFactor * v.wert; + result += overlapFactor * v.Wert; } else { - result = v.wert; + result = v.Wert; } overallDenominator += overlapFactor; } @@ -321,9 +326,9 @@ public static List GetMissingTimeRanges(this BO4E.BO.Energiemenge em, IDictionary, Verbrauch> filteredVerbrauch; using (MiniProfiler.Current.Step($"Filtering energieverbrauch on OBIS={obis}, WEV={wev}, Mengeneinheit={me}")) { - filteredVerbrauch = em.energieverbrauch - .Where(v => v.wertermittlungsverfahren == wev && v.obiskennzahl == obis && v.einheit == me) - .ToDictionary(v => new Tuple(v.startdatum, v.enddatum), v => v); + filteredVerbrauch = em.Energieverbrauch + .Where(v => v.Wertermittlungsverfahren == wev && v.Obiskennzahl == obis && v.Einheit == me) + .ToDictionary(v => new Tuple(v.Startdatum, v.Enddatum), v => v); } if (filteredVerbrauch.Count < 2) { @@ -339,7 +344,7 @@ public static List GetMissingTimeRanges(this BO4E.BO.Energiemenge em, throw new ArgumentException($"The absolute difference between reference.start ({reference.Start}) and the minimal date time in the Energiemenge ({em.GetMinDate()}) has to be an integer multiple of the periodicity {periodicity.TotalMilliseconds} but was {(reference.Start - em.GetMinDate()).TotalMilliseconds}."); } // since it's assured, that the energieverbrauch entries are evenly spaced it doesn't matter which entry we use to determine the duration. - TimeSpan duration = filteredVerbrauch.Values.Min(v => v.enddatum) - filteredVerbrauch.Values.Min(v => v.startdatum); + TimeSpan duration = filteredVerbrauch.Values.Min(v => v.Enddatum) - filteredVerbrauch.Values.Min(v => v.Startdatum); List result = new List(); using (MiniProfiler.Current.Step("Populating list with time slices in UTC")) { @@ -381,8 +386,8 @@ public static List GetMissingTimeRanges(this BO4E.BO.Energiemenge em, { throw new ArgumentException("The Energiemenge you provided is not pure. Consider using the overloaded method."); } - Verbrauch v = em.energieverbrauch.FirstOrDefault(); - return GetMissingTimeRanges(em, reference, v.wertermittlungsverfahren, v.obiskennzahl, v.einheit); + Verbrauch v = em.Energieverbrauch.FirstOrDefault(); + return GetMissingTimeRanges(em, reference, v.Wertermittlungsverfahren, v.Obiskennzahl, v.Einheit); } /// @@ -461,8 +466,8 @@ public static bool IsEvenlySpaced(this BO4E.BO.Energiemenge em, bool allowGaps = } else { - Verbrauch v = em.energieverbrauch.FirstOrDefault(); - return em.IsEvenlySpaced(em.GetTimeRange(), v.wertermittlungsverfahren, v.obiskennzahl, v.einheit, allowGaps); + Verbrauch v = em.Energieverbrauch.FirstOrDefault(); + return em.IsEvenlySpaced(em.GetTimeRange(), v.Wertermittlungsverfahren, v.Obiskennzahl, v.Einheit, allowGaps); } } @@ -471,12 +476,12 @@ public static bool IsEvenlySpaced(this BO4E.BO.Energiemenge em, bool allowGaps = private static HashSet GetTimeSpans(this BO4E.BO.Energiemenge em) { HashSet result = new HashSet(); - List vlist = new List(em.energieverbrauch); + List vlist = new List(em.Energieverbrauch); vlist.Sort(new VerbrauchDateTimeComparer()); for (int i = 1; i < vlist.Count; i++) { - result.Add(vlist[i].startdatum - vlist[i - 1].startdatum); - result.Add(vlist[i].enddatum - vlist[i - 1].enddatum); + result.Add(vlist[i].Startdatum - vlist[i - 1].Startdatum); + result.Add(vlist[i].Enddatum - vlist[i - 1].Enddatum); } return result; } @@ -484,13 +489,13 @@ private static HashSet GetTimeSpans(this BO4E.BO.Energiemenge em) private static HashSet GetTimeSpans(this BO4E.BO.Energiemenge em, Wertermittlungsverfahren wev, string obis, Mengeneinheit me) { HashSet result = new HashSet(); - List vlist = new List(em.energieverbrauch); + List vlist = new List(em.Energieverbrauch); vlist.Sort(new VerbrauchDateTimeComparer()); - vlist = vlist.Where(v => v.wertermittlungsverfahren == wev && v.obiskennzahl == obis && v.einheit == me).ToList(); + vlist = vlist.Where(v => v.Wertermittlungsverfahren == wev && v.Obiskennzahl == obis && v.Einheit == me).ToList(); for (int i = 1; i < vlist.Count; i++) { - result.Add(vlist[i].startdatum - vlist[i - 1].startdatum); - result.Add(vlist[i].enddatum - vlist[i - 1].enddatum); + result.Add(vlist[i].Startdatum - vlist[i - 1].Startdatum); + result.Add(vlist[i].Enddatum - vlist[i - 1].Enddatum); } return result; } @@ -503,9 +508,9 @@ private static HashSet GetTimeSpans(this BO4E.BO.Energiemenge em, Wert public static ISet> GetWevObisMeCombinations(this BO4E.BO.Energiemenge em) { return new HashSet>( - em.energieverbrauch + em.Energieverbrauch //.AsParallel() - .Select(v => Tuple.Create(v.wertermittlungsverfahren, v.obiskennzahl, v.einheit))); + .Select(v => Tuple.Create(v.Wertermittlungsverfahren, v.Obiskennzahl, v.Einheit))); } /// @@ -518,10 +523,10 @@ public static ISet> GetWe public static decimal GetJointCoverage(this BO4E.BO.Energiemenge em, TimeRange reference) { ISet> combinations = GetWevObisMeCombinations(em); - decimal jointCoverage = em.energieverbrauch + decimal jointCoverage = em.Energieverbrauch //.AsParallel() - .Where(v => combinations.Contains(Tuple.Create(v.wertermittlungsverfahren, v.obiskennzahl, v.einheit))) - .Sum(v => GetOverlapFactor(new TimeRange(v.startdatum, v.enddatum), reference, true)); + .Where(v => combinations.Contains(Tuple.Create(v.Wertermittlungsverfahren, v.Obiskennzahl, v.Einheit))) + .Sum(v => GetOverlapFactor(new TimeRange(v.Startdatum, v.Enddatum), reference, true)); return jointCoverage - (combinations.Count - 1); } @@ -539,12 +544,12 @@ public static decimal GetCoverage(this BO4E.BO.Energiemenge em, ITimeRange refer { throw new ArgumentException("The Energiemenge is not pure. Cannot determine parameters."); } - if (em.energieverbrauch.Count == 0) + if (em.Energieverbrauch.Count == 0) { return 0.0M; } - Verbrauch v = em.energieverbrauch.First(); - return em.GetCoverage(reference, v.wertermittlungsverfahren, v.obiskennzahl, v.einheit); + Verbrauch v = em.Energieverbrauch.First(); + return em.GetCoverage(reference, v.Wertermittlungsverfahren, v.Obiskennzahl, v.Einheit); } } @@ -573,12 +578,12 @@ public static decimal GetCoverage(this BO4E.BO.Energiemenge em, ITimeRange refer Wertermittlungsverfahren wev, string obisKz, Mengeneinheit mengeneinheit, int decimalRounding = 10) { decimal exactResult; - using (MiniProfiler.Current.Step($"calculating coverage for list with {em.energieverbrauch.Count} entries.")) + using (MiniProfiler.Current.Step($"calculating coverage for list with {em.Energieverbrauch.Count} entries.")) { - exactResult = em.energieverbrauch + exactResult = em.Energieverbrauch //.AsParallel() - .Where(v => v.einheit == mengeneinheit && v.obiskennzahl == obisKz && v.wertermittlungsverfahren == wev) - .Sum(v => GetOverlapFactor(new TimeRange(v.startdatum, v.enddatum), reference, true)); + .Where(v => v.Einheit == mengeneinheit && v.Obiskennzahl == obisKz && v.Wertermittlungsverfahren == wev) + .Sum(v => GetOverlapFactor(new TimeRange(v.Startdatum, v.Enddatum), reference, true)); } return Math.Round(exactResult, decimalRounding); } @@ -605,7 +610,7 @@ public static bool IsContinuous(this BO4E.BO.Energiemenge em) /// true iff Energiemenge has defined value for every point in time range, false otherwise public static bool IsContinuous(this BO4E.BO.Energiemenge em, TimeRange reference) { - return Math.Abs(em.energieverbrauch.Sum(v => GetOverlapFactor(new TimeRange(v.startdatum, v.enddatum), reference, true)) - 1.0M) < QUASI_ZERO; + return Math.Abs(em.Energieverbrauch.Sum(v => GetOverlapFactor(new TimeRange(v.Startdatum, v.Enddatum), reference, true)) - 1.0M) < QUASI_ZERO; } private static decimal GetOverlapFactor(TimeRange period, ITimeRange reference, bool toReference) @@ -668,7 +673,7 @@ public static bool IsPureWertermittlungsverfahren(this BO4E.BO.Energiemenge em) using (MiniProfiler.Current.Step(nameof(IsPureWertermittlungsverfahren))) { ISet wefs = new HashSet(); - em.energieverbrauch.All(v => wefs.Add(v.wertermittlungsverfahren)); + em.Energieverbrauch.All(v => wefs.Add(v.Wertermittlungsverfahren)); return wefs.Count <= 1; } } @@ -683,13 +688,13 @@ public static bool IsPureObisKennzahl(this BO4E.BO.Energiemenge em) using (MiniProfiler.Current.Step(nameof(IsPureObisKennzahl))) { ISet obisKzs = new HashSet(); - em.energieverbrauch.All(v => obisKzs.Add(v.obiskennzahl)); + em.Energieverbrauch.All(v => obisKzs.Add(v.Obiskennzahl)); return obisKzs.Count <= 1; } } /// - /// test if all entries in do have same user properties. + /// test if all entries in do have same user properties. /// Only tests for those user properties present. Missing user properties do not lead to false. /// /// Energiemenge @@ -698,14 +703,14 @@ public static bool IsPureUserProperties(this BO4E.BO.Energiemenge em) { using (MiniProfiler.Current.Step(nameof(IsPureUserProperties))) { - ISet upKeys = new HashSet(em.energieverbrauch.Where(v => v.userProperties != null).SelectMany(v => v.userProperties.Keys)); + ISet upKeys = new HashSet(em.Energieverbrauch.Where(v => v.UserProperties != null).SelectMany(v => v.UserProperties.Keys)); var values = new Dictionary(); // ToDo: make it nice. - foreach (var v in em.energieverbrauch.Where(v => v.userProperties != null)) + foreach (var v in em.Energieverbrauch.Where(v => v.UserProperties != null)) { foreach (var key in upKeys) { - if (v.userProperties.TryGetValue(key, out JToken rawValue)) + if (v.UserProperties.TryGetValue(key, out JToken rawValue)) { if (values.TryGetValue(key, out JToken onlyValue)) { @@ -735,7 +740,7 @@ public static bool IsPureMengeneinheit(this BO4E.BO.Energiemenge em) using (MiniProfiler.Current.Step(nameof(IsPureMengeneinheit))) { ISet einheiten = new HashSet(); - em.energieverbrauch.All(v => einheiten.Add(v.einheit)); + em.Energieverbrauch.All(v => einheiten.Add(v.Einheit)); if (einheiten.Count <= 1) { @@ -773,22 +778,22 @@ public static bool IsIntensive(this BO4E.BO.Energiemenge em) /// true iff all ->energieverbrauch entries are extensive public static bool IsExtensive(this BO4E.BO.Energiemenge em) { - return em.IsPureMengeneinheit() && em.energieverbrauch.First().einheit.IsExtensive(); + return em.IsPureMengeneinheit() && em.Energieverbrauch.First().Einheit.IsExtensive(); } public static List SplitInPureGroups(this BO.Energiemenge em) { - if (em.energieverbrauch == null) + if (em.Energieverbrauch == null) { return new List() { em }; } else { var result = new List(); - foreach (var group in em.energieverbrauch.GroupBy(PurityGrouper)) + foreach (var group in em.Energieverbrauch.GroupBy(PurityGrouper)) { BO.Energiemenge pureEm = em.DeepClone(); - pureEm.energieverbrauch = group.ToList(); + pureEm.Energieverbrauch = group.ToList(); result.Add(pureEm); } return result; @@ -796,7 +801,7 @@ public static bool IsExtensive(this BO4E.BO.Energiemenge em) } /// - /// Our SAP CDS has a bug: When there's a change from non-DST to DST the is set + /// Our SAP CDS has a bug: When there's a change from non-DST to DST the is set /// to the first second of the DST period. To /// /// @@ -804,11 +809,11 @@ public static void FixSapCDSBug(this BO4E.BO.Energiemenge em) { using (MiniProfiler.Current.Step("Fix SAP CDS Bug (Energiemenge)")) { - if (em.energieverbrauch != null && !em.HasBeenSanitized()) + if (em.Energieverbrauch != null && !em.HasBeenSanitized()) { using (MiniProfiler.Current.Step($"for each Verbrauch entry: {nameof(FixSapCDSBug)}")) { - foreach (var v in em.energieverbrauch) + foreach (var v in em.Energieverbrauch) { v.FixSapCdsBug(); } @@ -816,21 +821,21 @@ public static void FixSapCDSBug(this BO4E.BO.Energiemenge em) } using (MiniProfiler.Current.Step("for list as a whole")) { - foreach (var relevantEnddatum in em.energieverbrauch.Where(v => + foreach (var relevantEnddatum in em.Energieverbrauch.Where(v => { - var localEnd = DateTime.SpecifyKind(v.enddatum, DateTimeKind.Unspecified); - var localStart = DateTime.SpecifyKind(v.startdatum, DateTimeKind.Unspecified); + var localEnd = DateTime.SpecifyKind(v.Enddatum, DateTimeKind.Unspecified); + var localStart = DateTime.SpecifyKind(v.Startdatum, DateTimeKind.Unspecified); return !Verbrauch.CENTRAL_EUROPE_STANDARD_TIME.IsDaylightSavingTime(localStart) && Verbrauch.CENTRAL_EUROPE_STANDARD_TIME.IsDaylightSavingTime(localEnd); //return !localStart.IsDaylightSavingTime() && localEnd.IsDaylightSavingTime(); - }).Select(v => v.enddatum)) + }).Select(v => v.Enddatum)) { - var intervalSize = em.energieverbrauch.Where(v => v.enddatum == relevantEnddatum).Select(v => (v.enddatum - v.startdatum).TotalSeconds).Min(); - foreach (var v in em.energieverbrauch.Where(v => v.enddatum == relevantEnddatum)) + var intervalSize = em.Energieverbrauch.Where(v => v.Enddatum == relevantEnddatum).Select(v => (v.Enddatum - v.Startdatum).TotalSeconds).Min(); + foreach (var v in em.Energieverbrauch.Where(v => v.Enddatum == relevantEnddatum)) { - v.enddatum = v.startdatum.AddSeconds(intervalSize); + v.Enddatum = v.Startdatum.AddSeconds(intervalSize); } } - if (em.energieverbrauch.Where(v => (v.enddatum - v.startdatum).TotalMinutes == -45).Count() > 1) + if (em.Energieverbrauch.Where(v => (v.Enddatum - v.Startdatum).TotalMinutes == -45).Count() > 1) { /*foreach (var dstAffected in em.energieverbrauch.Where(v => (v.enddatum - v.startdatum).TotalMinutes != -45)) { @@ -850,11 +855,11 @@ public static void FixSapCDSBug(this BO4E.BO.Energiemenge em) }*/ } } - if (em.userProperties == null) + if (em.UserProperties == null) { - em.userProperties = new Dictionary(); + em.UserProperties = new Dictionary(); } - em.userProperties[SAP_SANITIZED_USERPROPERTY_KEY] = true; + em.UserProperties[SAP_SANITIZED_USERPROPERTY_KEY] = true; } } } @@ -868,7 +873,7 @@ public static void FixSapCDSBug(this BO4E.BO.Energiemenge em) private static bool HasBeenSanitized(this BO4E.BO.Energiemenge em) { bool sanitized; - if (em.userProperties == null || !em.userProperties.TryGetValue(SAP_SANITIZED_USERPROPERTY_KEY, out JToken sapSanitizedToken)) + if (em.UserProperties == null || !em.UserProperties.TryGetValue(SAP_SANITIZED_USERPROPERTY_KEY, out JToken sapSanitizedToken)) { sanitized = false; } @@ -881,9 +886,9 @@ private static bool HasBeenSanitized(this BO4E.BO.Energiemenge em) public static void Detangle(this BO4E.BO.Energiemenge em) { - if (em.energieverbrauch != null) + if (em.Energieverbrauch != null) { - em.energieverbrauch = VerbrauchExtension.Detangle(em.energieverbrauch); + em.Energieverbrauch = VerbrauchExtension.Detangle(em.Energieverbrauch); } } @@ -893,20 +898,20 @@ protected class BasicVerbrauchDateTimeComparer : IComparer cv = new VerbrauchDateTimeComparer(); return cv.Compare(vx, vy); } } - private static readonly Func> PurityGrouper = v => new Tuple(v.wertermittlungsverfahren, v.einheit, v.obiskennzahl); + private static readonly Func> PurityGrouper = v => new Tuple(v.Wertermittlungsverfahren, v.Einheit, v.Obiskennzahl); } } diff --git a/BO4E-dotnet.Extensions/BusinessObjects/Energiemenge/EnergiemengeExtensionCompleteness.cs b/BO4E-dotnet.Extensions/BusinessObjects/Energiemenge/EnergiemengeExtensionCompleteness.cs index 570e5a0f..ce77576f 100644 --- a/BO4E-dotnet.Extensions/BusinessObjects/Energiemenge/EnergiemengeExtensionCompleteness.cs +++ b/BO4E-dotnet.Extensions/BusinessObjects/Energiemenge/EnergiemengeExtensionCompleteness.cs @@ -22,7 +22,7 @@ public static partial class EnergiemengeExtension /// public static CompletenessReport GetCompletenessReport(this BO4E.BO.Energiemenge em, CompletenessReport.CompletenessReportConfiguration config) { - return em.GetCompletenessReport(new TimeRange(config.referenceTimeFrame.startdatum.Value, config.referenceTimeFrame.enddatum.Value), config.wertermittlungsverfahren, config.obis, config.einheit); + return em.GetCompletenessReport(new TimeRange(config.ReferenceTimeFrame.Startdatum.Value, config.ReferenceTimeFrame.Enddatum.Value), config.Wertermittlungsverfahren, config.Obis, config.Einheit); } /// @@ -50,14 +50,14 @@ public static CompletenessReport GetCompletenessReport(this BO4E.BO.Energiemenge } return new CompletenessReport() { - lokationsId = em.lokationsId, - referenceTimeFrame = new Zeitraum() + LokationsId = em.LokationsId, + ReferenceTimeFrame = new Zeitraum() { - startdatum = reference.Start, - enddatum = reference.End + Startdatum = reference.Start, + Enddatum = reference.End }, - coverage = coverage, - _errorMessage = errorMessage + Coverage = coverage, + ErrorMessage = errorMessage }; } var combi = combis.First(); @@ -80,19 +80,19 @@ public static CompletenessReport GetCompletenessReport(this BO4E.BO.Energiemenge { result = new CompletenessReport { - lokationsId = em.lokationsId, - einheit = einheit, - coverage = GetCoverage(em, reference, wev, obiskennzahl, einheit), + LokationsId = em.LokationsId, + Einheit = einheit, + Coverage = GetCoverage(em, reference, wev, obiskennzahl, einheit), wertermittlungsverfahren = wev, - obiskennzahl = obiskennzahl, - referenceTimeFrame = new Zeitraum + Obiskennzahl = obiskennzahl, + ReferenceTimeFrame = new Zeitraum { - startdatum = DateTime.SpecifyKind(reference.Start, DateTimeKind.Utc), - enddatum = DateTime.SpecifyKind(reference.End, DateTimeKind.Utc) + Startdatum = DateTime.SpecifyKind(reference.Start, DateTimeKind.Utc), + Enddatum = DateTime.SpecifyKind(reference.End, DateTimeKind.Utc) }, }; } - if (em.energieverbrauch != null && em.energieverbrauch.Count > 0) + if (em.Energieverbrauch != null && em.Energieverbrauch.Count > 0) { /*using (MiniProfiler.Current.Step("populating time slices of/with missing/null values")) { @@ -120,22 +120,22 @@ public static CompletenessReport GetCompletenessReport(this BO4E.BO.Energiemenge }*/ using (MiniProfiler.Current.Step("Setting aggregated gaps")) { - var nonNullValues = new TimePeriodCollection(em.energieverbrauch.Select(v => new TimeRange(v.startdatum, v.enddatum))); + var nonNullValues = new TimePeriodCollection(em.Energieverbrauch.Select(v => new TimeRange(v.Startdatum, v.Enddatum))); ITimeRange limits; - if (result.referenceTimeFrame != null && result.referenceTimeFrame.startdatum.HasValue && result.referenceTimeFrame.enddatum.HasValue) + if (result.ReferenceTimeFrame != null && result.ReferenceTimeFrame.Startdatum.HasValue && result.ReferenceTimeFrame.Enddatum.HasValue) { - limits = new TimeRange(result.referenceTimeFrame.startdatum.Value, result.referenceTimeFrame.enddatum.Value); + limits = new TimeRange(result.ReferenceTimeFrame.Startdatum.Value, result.ReferenceTimeFrame.Enddatum.Value); } else { limits = null; } var gaps = (new TimeGapCalculator()).GetGaps(nonNullValues, limits: limits); - result.gaps = gaps.Select(gap => new CompletenessReport.BasicVerbrauch() + result.Gaps = gaps.Select(gap => new CompletenessReport.BasicVerbrauch() { - startdatum = gap.Start, - enddatum = gap.End, - wert = null + Startdatum = gap.Start, + Enddatum = gap.End, + Wert = null }).ToList(); } @@ -147,15 +147,15 @@ public static CompletenessReport GetCompletenessReport(this BO4E.BO.Energiemenge { try { - foreach (var kvp in em.energieverbrauch.Where(v => v.userProperties != null).SelectMany(v => v.userProperties)) + foreach (var kvp in em.Energieverbrauch.Where(v => v.UserProperties != null).SelectMany(v => v.UserProperties)) { - if (result.userProperties == null) + if (result.UserProperties == null) { - result.userProperties = new Dictionary(); + result.UserProperties = new Dictionary(); } - if (!result.userProperties.ContainsKey(kvp.Key)) + if (!result.UserProperties.ContainsKey(kvp.Key)) { - result.userProperties.Add(kvp.Key, kvp.Value); + result.UserProperties.Add(kvp.Key, kvp.Value); } } } @@ -188,18 +188,18 @@ public static CompletenessReport GetCompletenessReport(this BO4E.BO.Energiemenge Verbrauch v; try { - v = em.energieverbrauch.First(); + v = em.Energieverbrauch.First(); } catch (InvalidOperationException) { return new CompletenessReport() { - coverage = null, - lokationsId = em.lokationsId, - _errorMessage = "energieverbrauch is empty" + Coverage = null, + LokationsId = em.LokationsId, + ErrorMessage = "energieverbrauch is empty" }; } - return em.GetCompletenessReport(em.GetTimeRange(), v.wertermittlungsverfahren, v.obiskennzahl, v.einheit); + return em.GetCompletenessReport(em.GetTimeRange(), v.Wertermittlungsverfahren, v.Obiskennzahl, v.Einheit); } /// diff --git a/BO4E-dotnet.Extensions/BusinessObjects/Energiemenge/EnergiemengeExtensionPlausibility.cs b/BO4E-dotnet.Extensions/BusinessObjects/Energiemenge/EnergiemengeExtensionPlausibility.cs index bed2ad3a..c2afc4d0 100644 --- a/BO4E-dotnet.Extensions/BusinessObjects/Energiemenge/EnergiemengeExtensionPlausibility.cs +++ b/BO4E-dotnet.Extensions/BusinessObjects/Energiemenge/EnergiemengeExtensionPlausibility.cs @@ -21,7 +21,7 @@ public static partial class EnergiemengeExtension /// reference Energiemenge (reference = used for normalisation) /// other Energiemenge /// time frame to be analysed. If null, the overlap of and is used. - /// By default (false) an ArgumentException is thrown if the do not match. Setting this flag suppresses the error. + /// By default (false) an ArgumentException is thrown if the do not match. Setting this flag suppresses the error. /// a public static PlausibilityReport GetPlausibilityReport(this BO4E.BO.Energiemenge emReference, BO4E.BO.Energiemenge emOther, ITimeRange timeframe = null, bool ignoreLocation = false) { @@ -34,9 +34,9 @@ public static PlausibilityReport GetPlausibilityReport(this BO4E.BO.Energiemenge ITimeRange overlap = trReference.GetIntersection(trOther); if (!ignoreLocation) { - if (!(emReference.lokationsId == emOther.lokationsId && emReference.lokationstyp == emOther.lokationstyp)) + if (!(emReference.LokationsId == emOther.LokationsId && emReference.LokationsTyp == emOther.LokationsTyp)) { - throw new ArgumentException($"locations do not match! '{emReference.lokationsId}' ({emReference.lokationstyp}) != '{emOther.lokationsId}' ({emOther.lokationstyp})"); + throw new ArgumentException($"locations do not match! '{emReference.LokationsId}' ({emReference.LokationsTyp}) != '{emOther.LokationsId}' ({emOther.LokationsTyp})"); } } timeframe = overlap; @@ -78,34 +78,34 @@ public static PlausibilityReport GetPlausibilityReport(this BO4E.BO.Energiemenge relativeDeviation = null; } - Verbrauch vReference = emReference.energieverbrauch.FirstOrDefault(); // copies obiskennzahl, wertermittlungsverfahren... - vReference.wert = consumptionReference.Item1; - vReference.einheit = consumptionReference.Item2; - vReference.startdatum = timeframe.Start; - vReference.enddatum = timeframe.End; + Verbrauch vReference = emReference.Energieverbrauch.FirstOrDefault(); // copies obiskennzahl, wertermittlungsverfahren... + vReference.Wert = consumptionReference.Item1; + vReference.Einheit = consumptionReference.Item2; + vReference.Startdatum = timeframe.Start; + vReference.Enddatum = timeframe.End; - Verbrauch vOther = emOther.energieverbrauch.FirstOrDefault(); // copies obiskennzahl, wertermittlungsverfahren... - vOther.wert = consumptionOther.Item1; - vOther.einheit = consumptionOther.Item2; - vOther.startdatum = timeframe.Start; - vOther.enddatum = timeframe.End; + Verbrauch vOther = emOther.Energieverbrauch.FirstOrDefault(); // copies obiskennzahl, wertermittlungsverfahren... + vOther.Wert = consumptionOther.Item1; + vOther.Einheit = consumptionOther.Item2; + vOther.Startdatum = timeframe.Start; + vOther.Enddatum = timeframe.End; var pr = new PlausibilityReport() { - lokationsId = emReference.lokationsId, - referenceTimeFrame = new BO4E.COM.Zeitraum() { startdatum = timeframe.Start, enddatum = timeframe.End }, - verbrauchReference = vReference, - verbrauchOther = vOther, - absoluteDeviation = Math.Abs(absoluteDeviation), - absoluteDeviationEinheit = consumptionReference.Item2 + LokationsId = emReference.LokationsId, + ReferenceTimeFrame = new BO4E.COM.Zeitraum() { Startdatum = timeframe.Start, Enddatum = timeframe.End }, + VerbrauchReference = vReference, + VerbrauchOther = vOther, + AbsoluteDeviation = Math.Abs(absoluteDeviation), + AbsoluteDeviationEinheit = consumptionReference.Item2 }; if (relativeDeviation.HasValue) { - pr.relativeDeviation = Math.Round(relativeDeviation.Value, 4); + pr.RelativeDeviation = Math.Round(relativeDeviation.Value, 4); } else { - pr.relativeDeviation = null; + pr.RelativeDeviation = null; } return pr; } @@ -118,7 +118,7 @@ public static PlausibilityReport GetPlausibilityReport(this BO4E.BO.Energiemenge /// public static PlausibilityReport GetPlausibilityReport(this BO4E.BO.Energiemenge energiemenge, PlausibilityReport.PlausibilityReportConfiguration config) { - return energiemenge.GetPlausibilityReport(config.other, new TimeRange(config.timeframe.startdatum.Value, config.timeframe.enddatum.Value), config.ignoreLocation); + return energiemenge.GetPlausibilityReport(config.Other, new TimeRange(config.Timeframe.Startdatum.Value, config.Timeframe.Enddatum.Value), config.IgnoreLocation); } /// @@ -137,10 +137,10 @@ public static IDictionary GetSlicedPlausibilityR foreach (var range in ranges) { var localConfig = JsonConvert.DeserializeObject(JsonConvert.SerializeObject(config)); - localConfig.timeframe = new Zeitraum() + localConfig.Timeframe = new Zeitraum() { - startdatum = range.Start, - enddatum = range.End + Startdatum = range.Start, + Enddatum = range.End }; var subResult = GetPlausibilityReport(em, localConfig); result.Add(range, subResult); @@ -153,7 +153,7 @@ public static IDictionary GetSlicedPlausibilityR /// The magic is, that it takes DST into account! /// /// Energiemenge - /// configuration that contains the overall time range in + /// configuration that contains the overall time range in /// public static IDictionary GetDailyPlausibilityReports(this BO.Energiemenge em, PlausibilityReportConfiguration config) { @@ -161,14 +161,14 @@ public static IDictionary GetDailyPlausibilityRe { throw new ArgumentNullException(nameof(config)); } - if (config.timeframe == null) + if (config.Timeframe == null) { - throw new ArgumentNullException(nameof(config.timeframe)); + throw new ArgumentNullException(nameof(config.Timeframe)); } var slices = GetLocalDailySlices(new TimeRange() { - Start = config.timeframe.startdatum.Value, - End = config.timeframe.enddatum.Value + Start = config.Timeframe.Startdatum.Value, + End = config.Timeframe.Enddatum.Value }); return em.GetSlicedPlausibilityReports(config, slices); } @@ -177,7 +177,7 @@ public static IDictionary GetDailyPlausibilityRe /// Get Monthly Completeness Reports for overall time range defined in . /// /// Energiemenge - /// configuration that contains the overall time range in + /// configuration that contains the overall time range in /// public static IDictionary GetMonthlyPlausibilityReports(this BO4E.BO.Energiemenge em, PlausibilityReportConfiguration config) { @@ -185,14 +185,14 @@ public static IDictionary GetMonthlyPlausibility { throw new ArgumentNullException(nameof(config)); } - if (config.timeframe == null) + if (config.Timeframe == null) { - throw new ArgumentNullException(nameof(config.timeframe)); + throw new ArgumentNullException(nameof(config.Timeframe)); } var slices = GetLocalMonthlySlices(new TimeRange() { - Start = config.timeframe.startdatum.Value, - End = config.timeframe.enddatum.Value + Start = config.Timeframe.Startdatum.Value, + End = config.Timeframe.Enddatum.Value }); return em.GetSlicedPlausibilityReports(config, slices); } diff --git a/BO4E-dotnet.Extensions/COM/PhysikalischerWertExtension.cs b/BO4E-dotnet.Extensions/COM/PhysikalischerWertExtension.cs index b6bd0514..0cf364cf 100644 --- a/BO4E-dotnet.Extensions/COM/PhysikalischerWertExtension.cs +++ b/BO4E-dotnet.Extensions/COM/PhysikalischerWertExtension.cs @@ -10,15 +10,15 @@ namespace BO4E.Extensions.COM public static class PhysikalischerWertExtension { /// - /// Converts a PhysikalischerWert to another unit, e.g. from kWh to MWh. This changes the and the accordingly + /// Converts a PhysikalischerWert to another unit, e.g. from kWh to MWh. This changes the and the accordingly /// /// physikalischer Wert /// new unit of measurement /// a new instance of PhysikalischerWert having the unit public static PhysikalischerWert ConvertToUnit(this PhysikalischerWert pw, Mengeneinheit newEinheit) { - decimal factor = pw.einheit.GetConversionFactor(newEinheit); // throws all the exceptions. - return new PhysikalischerWert(factor * pw.wert, newEinheit); + decimal factor = pw.Einheit.GetConversionFactor(newEinheit); // throws all the exceptions. + return new PhysikalischerWert(factor * pw.Wert, newEinheit); } } } diff --git a/BO4E-dotnet.Extensions/COM/VerbrauchExtension.cs b/BO4E-dotnet.Extensions/COM/VerbrauchExtension.cs index 483017b4..5a4d030f 100644 --- a/BO4E-dotnet.Extensions/COM/VerbrauchExtension.cs +++ b/BO4E-dotnet.Extensions/COM/VerbrauchExtension.cs @@ -31,66 +31,66 @@ public static HashSet MergeRedundant(this Verbrauch v1, Verbrauch v2, public static HashSet Merge(this Verbrauch v1, Verbrauch v2, bool redundant, Boolean biased) { HashSet result = new HashSet(); - if (v1.obiskennzahl == v2.obiskennzahl && v1.wertermittlungsverfahren == v2.wertermittlungsverfahren && v1.einheit == v2.einheit) + if (v1.Obiskennzahl == v2.Obiskennzahl && v1.Wertermittlungsverfahren == v2.Wertermittlungsverfahren && v1.Einheit == v2.Einheit) { if (v1.OverlapsWith(v2)) { // don't wanna deal with time running backwards. //Debug.Assert(v1.enddatum >= v1.startdatum); //Debug.Assert(v2.enddatum >= v2.startdatum); - TimeRange tr1 = new TimeRange(v1.startdatum, v1.enddatum); - TimeRange tr2 = new TimeRange(v2.startdatum, v2.enddatum); + TimeRange tr1 = new TimeRange(v1.Startdatum, v1.Enddatum); + TimeRange tr2 = new TimeRange(v2.Startdatum, v2.Enddatum); ITimeRange overlap = v1.GetIntersection(v2); - if (v1.einheit.IsExtensive()) + if (v1.Einheit.IsExtensive()) { Verbrauch vmerge = new Verbrauch() { - obiskennzahl = v1.obiskennzahl, - einheit = v1.einheit, - wertermittlungsverfahren = v1.wertermittlungsverfahren + Obiskennzahl = v1.Obiskennzahl, + Einheit = v1.Einheit, + Wertermittlungsverfahren = v1.Wertermittlungsverfahren }; if (redundant) { - decimal exclusiveV1Wert = (decimal)(tr1.Duration.TotalSeconds - overlap.Duration.TotalSeconds) * v1.wert / ((decimal)tr1.Duration.TotalSeconds); - decimal exclusiveV2Wert = (decimal)(tr2.Duration.TotalSeconds - overlap.Duration.TotalSeconds) * v2.wert / ((decimal)tr2.Duration.TotalSeconds); - decimal overlapV1Wert = ((decimal)overlap.Duration.TotalSeconds * v1.wert) / (decimal)(tr1.Duration.TotalSeconds); - decimal overlapV2Wert = ((decimal)overlap.Duration.TotalSeconds * v2.wert) / (decimal)(tr2.Duration.TotalSeconds); + decimal exclusiveV1Wert = (decimal)(tr1.Duration.TotalSeconds - overlap.Duration.TotalSeconds) * v1.Wert / ((decimal)tr1.Duration.TotalSeconds); + decimal exclusiveV2Wert = (decimal)(tr2.Duration.TotalSeconds - overlap.Duration.TotalSeconds) * v2.Wert / ((decimal)tr2.Duration.TotalSeconds); + decimal overlapV1Wert = ((decimal)overlap.Duration.TotalSeconds * v1.Wert) / (decimal)(tr1.Duration.TotalSeconds); + decimal overlapV2Wert = ((decimal)overlap.Duration.TotalSeconds * v2.Wert) / (decimal)(tr2.Duration.TotalSeconds); if (biased == true) { // biased ==> assume that v2 is contained in v1 - vmerge.startdatum = v1.startdatum; - vmerge.enddatum = v1.enddatum; + vmerge.Startdatum = v1.Startdatum; + vmerge.Enddatum = v1.Enddatum; if (exclusiveV1Wert == 0.0M && exclusiveV2Wert == 0.0M && overlapV1Wert == overlapV2Wert) { - vmerge.wert = overlapV1Wert; + vmerge.Wert = overlapV1Wert; } else { - vmerge.wert = v1.wert - overlapV2Wert; // overlapV1Wert; + vmerge.Wert = v1.Wert - overlapV2Wert; // overlapV1Wert; } } else if (biased == false) { - vmerge.startdatum = v1.startdatum; - vmerge.enddatum = v2.startdatum; - vmerge.wert = v1.wert - overlapV2Wert; + vmerge.Startdatum = v1.Startdatum; + vmerge.Enddatum = v2.Startdatum; + vmerge.Wert = v1.Wert - overlapV2Wert; } else // biased null { - vmerge.startdatum = v1.startdatum < v2.startdatum ? v1.startdatum : v2.startdatum; - vmerge.enddatum = v1.enddatum > v2.enddatum ? v1.enddatum : v2.enddatum; + vmerge.Startdatum = v1.Startdatum < v2.Startdatum ? v1.Startdatum : v2.Startdatum; + vmerge.Enddatum = v1.Enddatum > v2.Enddatum ? v1.Enddatum : v2.Enddatum; if (overlapV1Wert != overlapV2Wert) { throw new ArgumentException("The inequality is unsolvable."); } - vmerge.wert = exclusiveV1Wert + overlapV1Wert + exclusiveV2Wert; + vmerge.Wert = exclusiveV1Wert + overlapV1Wert + exclusiveV2Wert; } } else { - vmerge.startdatum = v1.startdatum < v2.startdatum ? v1.startdatum : v2.startdatum; - vmerge.enddatum = v1.enddatum > v2.enddatum ? v1.enddatum : v2.enddatum; - vmerge.wert = v1.wert + v2.wert; + vmerge.Startdatum = v1.Startdatum < v2.Startdatum ? v1.Startdatum : v2.Startdatum; + vmerge.Enddatum = v1.Enddatum > v2.Enddatum ? v1.Enddatum : v2.Enddatum; + vmerge.Wert = v1.Wert + v2.Wert; } result.Add(vmerge); } @@ -98,67 +98,67 @@ public static HashSet Merge(this Verbrauch v1, Verbrauch v2, bool red { Verbrauch vmerge1 = new Verbrauch() { - obiskennzahl = v1.obiskennzahl, - einheit = v1.einheit, - wertermittlungsverfahren = v1.wertermittlungsverfahren, - startdatum = v1.startdatum < v2.startdatum ? v1.startdatum : v2.startdatum, - enddatum = overlap.Start, - wert = v1.startdatum < v2.startdatum ? v1.wert : v2.wert + Obiskennzahl = v1.Obiskennzahl, + Einheit = v1.Einheit, + Wertermittlungsverfahren = v1.Wertermittlungsverfahren, + Startdatum = v1.Startdatum < v2.Startdatum ? v1.Startdatum : v2.Startdatum, + Enddatum = overlap.Start, + Wert = v1.Startdatum < v2.Startdatum ? v1.Wert : v2.Wert }; Verbrauch vmerge2 = new Verbrauch() { - obiskennzahl = v1.obiskennzahl, - einheit = v1.einheit, - wertermittlungsverfahren = v1.wertermittlungsverfahren, - startdatum = overlap.Start, - enddatum = overlap.End + Obiskennzahl = v1.Obiskennzahl, + Einheit = v1.Einheit, + Wertermittlungsverfahren = v1.Wertermittlungsverfahren, + Startdatum = overlap.Start, + Enddatum = overlap.End }; if (redundant) { - if (v1.wert != v2.wert) + if (v1.Wert != v2.Wert) { - throw new ArgumentException($"Data cannot be redundant if values ({v1.wert}{v1.einheit} vs. {v2.wert}{v2.einheit}) don't match for interval [{vmerge2.startdatum}, {vmerge2.enddatum})."); + throw new ArgumentException($"Data cannot be redundant if values ({v1.Wert}{v1.Einheit} vs. {v2.Wert}{v2.Einheit}) don't match for interval [{vmerge2.Startdatum}, {vmerge2.Enddatum})."); } - vmerge2.wert = v1.wert; + vmerge2.Wert = v1.Wert; } else { - vmerge2.wert = v1.wert + v2.wert; + vmerge2.Wert = v1.Wert + v2.Wert; } Verbrauch vmerge3 = new Verbrauch() { - obiskennzahl = v1.obiskennzahl, - einheit = v1.einheit, - wertermittlungsverfahren = v1.wertermittlungsverfahren, - startdatum = overlap.End, - enddatum = v1.enddatum > v2.enddatum ? v1.enddatum : v2.enddatum, - wert = v1.enddatum > v2.enddatum ? v1.wert : v2.wert + Obiskennzahl = v1.Obiskennzahl, + Einheit = v1.Einheit, + Wertermittlungsverfahren = v1.Wertermittlungsverfahren, + Startdatum = overlap.End, + Enddatum = v1.Enddatum > v2.Enddatum ? v1.Enddatum : v2.Enddatum, + Wert = v1.Enddatum > v2.Enddatum ? v1.Wert : v2.Wert }; result.Add(vmerge1); result.Add(vmerge2); result.Add(vmerge3); } } - else if (v1.startdatum == v2.enddatum || v2.startdatum == v1.enddatum) + else if (v1.Startdatum == v2.Enddatum || v2.Startdatum == v1.Enddatum) { - DateTime start = v1.startdatum < v2.startdatum ? v1.startdatum : v2.startdatum; - DateTime stop = v1.enddatum > v2.enddatum ? v1.enddatum : v2.enddatum; + DateTime start = v1.Startdatum < v2.Startdatum ? v1.Startdatum : v2.Startdatum; + DateTime stop = v1.Enddatum > v2.Enddatum ? v1.Enddatum : v2.Enddatum; Verbrauch vmerge = new Verbrauch() { - obiskennzahl = v1.obiskennzahl, - einheit = v1.einheit, - wertermittlungsverfahren = v1.wertermittlungsverfahren, - startdatum = start, - enddatum = stop + Obiskennzahl = v1.Obiskennzahl, + Einheit = v1.Einheit, + Wertermittlungsverfahren = v1.Wertermittlungsverfahren, + Startdatum = start, + Enddatum = stop }; - if (v1.einheit.IsExtensive()) + if (v1.Einheit.IsExtensive()) { - vmerge.wert = v1.wert + v2.wert; + vmerge.Wert = v1.Wert + v2.Wert; result.Add(vmerge); } - else if (v1.wert == v2.wert) // implicitly intensive + else if (v1.Wert == v2.Wert) // implicitly intensive { - vmerge.wert = v1.wert; + vmerge.Wert = v1.Wert; result.Add(vmerge); } else @@ -181,18 +181,18 @@ public static HashSet Merge(this Verbrauch v1, Verbrauch v2, bool red result.Add(v1); result.Add(v2); } - result.RemoveWhere(v => v.einheit.IsIntensive() && new TimeRange(v.startdatum, v.enddatum).Duration.TotalMilliseconds == 0); + result.RemoveWhere(v => v.Einheit.IsIntensive() && new TimeRange(v.Startdatum, v.Enddatum).Duration.TotalMilliseconds == 0); return result; } /// - /// returns time range from , + /// returns time range from , /// /// Verbrauch /// public static TimeRange GetTimeRange(this Verbrauch v) { - return new TimeRange(v.startdatum, v.enddatum); + return new TimeRange(v.Startdatum, v.Enddatum); } public static TimeSpan GetDuration(this Verbrauch v) @@ -219,11 +219,11 @@ public static List Detangle(IEnumerable input) { //var filteredInput = KeepShortestSlices(input); HashSet resultSet = new HashSet(); - var groups = input.OrderBy(v => (v.startdatum, v.wertermittlungsverfahren, v.obiskennzahl, v.einheit)).GroupBy(v => new Tuple + var groups = input.OrderBy(v => (v.Startdatum, v.Wertermittlungsverfahren, v.Obiskennzahl, v.Einheit)).GroupBy(v => new Tuple ( - v.wertermittlungsverfahren, - v.obiskennzahl, - v.einheit + v.Wertermittlungsverfahren, + v.Obiskennzahl, + v.Einheit )); foreach (var vGroup in groups) { @@ -232,7 +232,7 @@ public static List Detangle(IEnumerable input) // find pairs (x,y) where x.end == y.start: // |----x----|--------y--------| //var adjacentVerbrauchs = from x in vGroup join y in vGroup on x.enddatum equals y.startdatum select new { x, y }; - var adjacentVerbrauchs = from x in vGroup join y in vGroup on x.enddatum equals y.startdatum select new { x, y }; + var adjacentVerbrauchs = from x in vGroup join y in vGroup on x.Enddatum equals y.Startdatum select new { x, y }; foreach (var av in adjacentVerbrauchs) { subResult.Add(av.x); @@ -243,10 +243,10 @@ public static List Detangle(IEnumerable input) // |-------------z-------------| // ==> delete z from result where z.start == x.start and z.end == y.end //var fullyRedundantVerbrauchs = from av in adjacentVerbrauchs join z in vGroup on new { av.x.startdatum, av.y.enddatum } equals new { z.startdatum, z.enddatum } select new { av, z }; - var fullyRedundantVerbrauchs = from av in adjacentVerbrauchs join z in vGroup on new { av.x.startdatum, av.y.enddatum } equals new { z.startdatum, z.enddatum } select new { av, z }; + var fullyRedundantVerbrauchs = from av in adjacentVerbrauchs join z in vGroup on new { av.x.Startdatum, av.y.Enddatum } equals new { z.Startdatum, z.Enddatum } select new { av, z }; foreach (var frv in fullyRedundantVerbrauchs) { - if (frv.av.x.wert + frv.av.y.wert != frv.z.wert) + if (frv.av.x.Wert + frv.av.y.Wert != frv.z.Wert) { throw new ArgumentException($"Inconsistent data detected: {JsonConvert.SerializeObject(frv.av.x)} + {JsonConvert.SerializeObject(frv.av.y)} ≠ {JsonConvert.SerializeObject(frv.z)}"); } @@ -279,19 +279,19 @@ public static List Detangle(IEnumerable input) { Verbrauch v = new Verbrauch() { - einheit = z.einheit, - wertermittlungsverfahren = z.wertermittlungsverfahren, - obiskennzahl = z.obiskennzahl, - startdatum = tr.Start, - enddatum = tr.End + Einheit = z.Einheit, + Wertermittlungsverfahren = z.Wertermittlungsverfahren, + Obiskennzahl = z.Obiskennzahl, + Startdatum = tr.Start, + Enddatum = tr.End }; xs.Add(v); } - var totalXWert = z.wert - ys.Select(y => y.wert).Sum(); + var totalXWert = z.Wert - ys.Select(y => y.Wert).Sum(); var totalXDuration = xs.Select(x => x.GetDuration().TotalSeconds).Sum(); foreach (var x in xs) { - x.wert = (totalXWert * (decimal)x.GetDuration().TotalSeconds) / ((decimal)totalXDuration); + x.Wert = (totalXWert * (decimal)x.GetDuration().TotalSeconds) / ((decimal)totalXDuration); } subResult.Remove(z); subResult.UnionWith(xs); @@ -312,10 +312,10 @@ public static List Detangle(IEnumerable input) /// ArgumentException if units are not convertible public static void ConvertToUnit(this Verbrauch v, Mengeneinheit mengeneinheit) { - PhysikalischerWert oldWert = new PhysikalischerWert(v.wert, v.einheit); + PhysikalischerWert oldWert = new PhysikalischerWert(v.Wert, v.Einheit); PhysikalischerWert newWert = oldWert.ConvertToUnit(mengeneinheit); - v.wert = newWert.wert; - v.einheit = newWert.einheit; + v.Wert = newWert.Wert; + v.Einheit = newWert.Einheit; } /// @@ -326,43 +326,43 @@ public static void ConvertToUnit(this Verbrauch v, Mengeneinheit mengeneinheit) /// true iff [.startdatum, .enddatum) and [.startdatum, .enddatum) overlap public static bool OverlapsWith(this Verbrauch v1, Verbrauch v2) { - return v1.OverlapsWith(new TimeRange(v2.startdatum, v2.enddatum, true)); + return v1.OverlapsWith(new TimeRange(v2.Startdatum, v2.Enddatum, true)); } public static bool OverlapsWith(this Verbrauch v1, ITimeRange tr2) { - return new TimeRange(v1.startdatum, v1.enddatum).OverlapsWith(tr2); + return new TimeRange(v1.Startdatum, v1.Enddatum).OverlapsWith(tr2); } public static ITimeRange GetIntersection(this Verbrauch v1, ITimeRange tr2) { - return (new TimeRange(v1.startdatum, v1.enddatum).GetIntersection(tr2)); + return (new TimeRange(v1.Startdatum, v1.Enddatum).GetIntersection(tr2)); } public static ITimeRange GetIntersection(this Verbrauch v1, Verbrauch v2) { - return v1.GetIntersection(new TimeRange(v2.startdatum, v2.enddatum)); + return v1.GetIntersection(new TimeRange(v2.Startdatum, v2.Enddatum)); } public static bool Contains(this Verbrauch v1, Verbrauch v2) { - return v1.OverlapsWith(v2) && v1.startdatum <= v2.startdatum && v1.enddatum >= v2.enddatum; + return v1.OverlapsWith(v2) && v1.Startdatum <= v2.Startdatum && v1.Enddatum >= v2.Enddatum; } /// - /// Allows to sort lists of by , ascending + /// Allows to sort lists of by , ascending /// public class VerbrauchDateTimeComparer : IComparer { int IComparer.Compare(Verbrauch x, Verbrauch y) { - if (x.startdatum != y.startdatum) + if (x.Startdatum != y.Startdatum) { - return DateTime.Compare(x.startdatum, y.startdatum); + return DateTime.Compare(x.Startdatum, y.Startdatum); } - else if (x.enddatum != y.enddatum) + else if (x.Enddatum != y.Enddatum) { - return DateTime.Compare(x.enddatum, y.enddatum); + return DateTime.Compare(x.Enddatum, y.Enddatum); } else { diff --git a/BO4E-dotnet.Reporting/BO4E-dotnet.Reporting.csproj b/BO4E-dotnet.Reporting/BO4E-dotnet.Reporting.csproj index 5e441e04..f25a428b 100644 --- a/BO4E-dotnet.Reporting/BO4E-dotnet.Reporting.csproj +++ b/BO4E-dotnet.Reporting/BO4E-dotnet.Reporting.csproj @@ -12,6 +12,7 @@ Hochfrequenz.BO4E.Reporting Hochfrequenz Unternehmensberatung GmbH Hochfrequenz Unternehmensberatung GmbH + 0.2.0 diff --git a/BO4E-dotnet.Reporting/CompletenessReport.cs b/BO4E-dotnet.Reporting/CompletenessReport.cs index 2959aab5..1406300e 100644 --- a/BO4E-dotnet.Reporting/CompletenessReport.cs +++ b/BO4E-dotnet.Reporting/CompletenessReport.cs @@ -1,8 +1,10 @@ using System; using System.Collections.Generic; + using BO4E.COM; using BO4E.ENUM; using BO4E.meta; + using Newtonsoft.Json; namespace BO4E.Reporting @@ -10,68 +12,68 @@ namespace BO4E.Reporting /// /// A completeness report contains information about the completeness of a pure /// . In this context "pure" means, that the Energiemenge - /// does only contain one distinct set of (, , - /// ). + /// does only contain one distinct set of (, , + /// ). /// public class CompletenessReport : Report, IComparable { /// - /// all information like e.g. is normalised to this reference time frame. - /// Must only be null if an error occurred and is not null. + /// all information like e.g. is normalised to this reference time frame. + /// Must only be null if an error occurred and is not null. /// - [JsonProperty(Required = Required.AllowNull, Order = 7)] - public Zeitraum referenceTimeFrame; + [JsonProperty(PropertyName = "referenceTimeFrame", Required = Required.AllowNull, Order = 7)] + public Zeitraum ReferenceTimeFrame { get; set; } /// /// /// [DataCategory(DataCategory.POD)] - [JsonProperty(Required = Required.Always, Order = 8)] - public string lokationsId; + [JsonProperty(PropertyName = "lokationsId", Required = Required.Always, Order = 8)] + public string LokationsId { get; set; } /// - /// + /// /// - [JsonProperty(Required = Required.Default, Order = 5)] - public string obiskennzahl; + [JsonProperty(PropertyName = "obiskennzahl", Required = Required.Default, Order = 5)] + public string Obiskennzahl { get; set; } /// - /// + /// /// - [JsonProperty(Required = Required.Default, Order = 6)] - public Mengeneinheit einheit; + [JsonProperty(PropertyName = "einheit", Required = Required.Default, Order = 6)] + public Mengeneinheit Einheit { get; set; } /// - /// + /// /// - [JsonProperty(Required = Required.Default, Order = 7)] - public Wertermittlungsverfahren wertermittlungsverfahren; + [JsonProperty(PropertyName = "wertermittlungsverfahren", Required = Required.Default, Order = 7)] + public Wertermittlungsverfahren wertermittlungsverfahren { get; set; } /// - /// ratio of time with data present compared to . + /// ratio of time with data present compared to . /// 1.0 means 100% coverage. /// - [JsonProperty(Required = Required.AllowNull, Order = 8)] - public decimal? coverage; + [JsonProperty(PropertyName = "coverage", Required = Required.AllowNull, Order = 8)] + public decimal? Coverage { get; set; } /// /// values /// - [JsonProperty(Required = Required.Default, Order = 5)] + [JsonProperty(PropertyName = "values", Required = Required.Default, Order = 5)] [DataCategory(DataCategory.METER_READING)] - public List values; + public List Values { get; set; } /// - /// gaps are continous values () with value null. + /// gaps are continous values () with value null. /// - [JsonProperty(Required = Required.Default, Order = 6)] - public List gaps; + [JsonProperty(PropertyName = "gaps", Required = Required.Default, Order = 6)] + public List Gaps { get; set; } /// /// optional field for storing error messages /// - [JsonProperty(Required = Required.Default)] - public string _errorMessage; + [JsonProperty(PropertyName = "_errorMessage", Required = Required.Default)] + public string ErrorMessage { get; set; } // ToDo: make it nice. /// @@ -81,25 +83,25 @@ public class CompletenessReport : Report, IComparable /// public int CompareTo(CompletenessReport other) { - if(this.referenceTimeFrame==null && other.referenceTimeFrame == null) + if (this.ReferenceTimeFrame == null && other.ReferenceTimeFrame == null) { return 0; } - if(this.referenceTimeFrame!=null && other.referenceTimeFrame == null) + if (this.ReferenceTimeFrame != null && other.ReferenceTimeFrame == null) { return 1; } - if(this.referenceTimeFrame==null && other.referenceTimeFrame != null) + if (this.ReferenceTimeFrame == null && other.ReferenceTimeFrame != null) { return -1; } - if(this.referenceTimeFrame!=null && other.referenceTimeFrame != null) + if (this.ReferenceTimeFrame != null && other.ReferenceTimeFrame != null) { - if(this.referenceTimeFrame.startdatum.HasValue && other.referenceTimeFrame.startdatum.HasValue) + if (this.ReferenceTimeFrame.Startdatum.HasValue && other.ReferenceTimeFrame.Startdatum.HasValue) { - return Comparer.Default.Compare(referenceTimeFrame.startdatum.Value, other.referenceTimeFrame.startdatum.Value); + return Comparer.Default.Compare(ReferenceTimeFrame.Startdatum.Value, other.ReferenceTimeFrame.Startdatum.Value); } - if (this.referenceTimeFrame.startdatum.HasValue) + if (this.ReferenceTimeFrame.Startdatum.HasValue) { return 1; } @@ -118,21 +120,21 @@ public int CompareTo(CompletenessReport other) public class BasicVerbrauch // : Verbrauch { /// - /// + /// /// - [JsonProperty(Required = Required.Always)] - public DateTime startdatum; + [JsonProperty(PropertyName = "startdatum", Required = Required.Always)] + public DateTime Startdatum { get; set; } /// - /// + /// /// - [JsonProperty(Required = Required.Always)] - public DateTime enddatum; + [JsonProperty(PropertyName = "enddatum", Required = Required.Always)] + public DateTime Enddatum { get; set; } /// - /// . Make it null to express no value present. + /// . Make it null to express no value present. /// [DataCategory(DataCategory.METER_READING)] - [JsonProperty(Required = Required.AllowNull)] - public decimal? wert; + [JsonProperty(PropertyName = "wert", Required = Required.AllowNull)] + public decimal? Wert { get; set; } /* [JsonIgnore] @@ -158,26 +160,26 @@ public class CompletenessReportConfiguration /// /// reference time frame to be analysed /// - [JsonProperty(Required = Required.Always, Order = 7)] - public Zeitraum referenceTimeFrame; + [JsonProperty(PropertyName = "referenceTimeFrame", Required = Required.Always, Order = 7)] + public Zeitraum ReferenceTimeFrame { get; set; } /// - /// Wertermittlungsverfahren () to be taken into account. + /// Wertermittlungsverfahren () to be taken into account. /// - [JsonProperty(Required = Required.Default, Order = 8)] - public Wertermittlungsverfahren wertermittlungsverfahren; + [JsonProperty(PropertyName = "wertermittlungsverfahren", Required = Required.Default, Order = 8)] + public Wertermittlungsverfahren Wertermittlungsverfahren { get; set; } /// - /// OBIS ID () to be taken into account. + /// OBIS ID () to be taken into account. /// - [JsonProperty(Required = Required.Default, Order = 5)] - public string obis; + [JsonProperty(PropertyName = "obis", Required = Required.Default, Order = 5)] + public string Obis { get; set; } /// - /// Unit () to be taken into account. + /// Unit () to be taken into account. /// - [JsonProperty(Required = Required.Default, Order = 6)] - public Mengeneinheit einheit; + [JsonProperty(PropertyName = "einheit", Required = Required.Default, Order = 6)] + public Mengeneinheit Einheit { get; set; } } /* /// diff --git a/BO4E-dotnet.Reporting/PlausibilityReport.cs b/BO4E-dotnet.Reporting/PlausibilityReport.cs index 9742c3ac..359b6e26 100644 --- a/BO4E-dotnet.Reporting/PlausibilityReport.cs +++ b/BO4E-dotnet.Reporting/PlausibilityReport.cs @@ -2,6 +2,7 @@ using BO4E.COM; using BO4E.ENUM; using BO4E.meta; + using Newtonsoft.Json; namespace BO4E.Reporting @@ -18,53 +19,53 @@ public class PlausibilityReport : Report /// /// all information is normalised to this reference time frame /// - [JsonProperty(Required = Required.Always, Order = 7)] - public Zeitraum referenceTimeFrame; + [JsonProperty(PropertyName = "referenceTimeFrame", Required = Required.Always, Order = 7)] + public Zeitraum ReferenceTimeFrame { get; set; } /// - /// refers to a + /// refers to a /// [DataCategory(DataCategory.POD)] - [JsonProperty(Required = Required.Always, Order = 8)] - public string lokationsId; + [JsonProperty(PropertyName = "lokationsId", Required = Required.Always, Order = 8)] + public string LokationsId { get; set; } /// - /// relative deviation of both Energiemengen within . - /// Null iff the of is 0. + /// relative deviation of both Energiemengen within . + /// Null iff the of is 0. /// /// /// 0 = equal consumption /// +1 = other Energiemenge has twice the consumption of the reference /// -1 = other Energiemenge has 0 consumption /// - [JsonProperty(Required = Required.AllowNull, Order = 5)] - public decimal? relativeDeviation; + [JsonProperty(PropertyName = "relativeDeviation", Required = Required.AllowNull, Order = 5)] + public decimal? RelativeDeviation { get; set; } /// /// Verbrauch of the reference Energiemenge /// [DataCategory(DataCategory.METER_READING)] - [JsonProperty(Required = Required.Always, Order = 6)] - public Verbrauch verbrauchReference; + [JsonProperty(PropertyName = "verbrauchReference", Required = Required.Always, Order = 6)] + public Verbrauch VerbrauchReference { get; set; } /// /// Verbrauch of another Energiemenge /// [DataCategory(DataCategory.METER_READING)] - [JsonProperty(Required = Required.Always, Order = 7)] - public Verbrauch verbrauchOther; + [JsonProperty(PropertyName = "verbrauchOther", Required = Required.Always, Order = 7)] + public Verbrauch VerbrauchOther { get; set; } /// - /// absolute value of the difference between of and + /// absolute value of the difference between of and /// - [JsonProperty(Required = Required.Always, Order = 8)] - public decimal absoluteDeviation; + [JsonProperty(PropertyName = "absoluteDeviation", Required = Required.Always, Order = 8)] + public decimal AbsoluteDeviation { get; set; } /// - /// unit of + /// unit of /// - [JsonProperty(Required = Required.Always, Order = 5)] - public Mengeneinheit absoluteDeviationEinheit; + [JsonProperty(PropertyName = "absoluteDeviationEinheit", Required = Required.Always, Order = 5)] + public Mengeneinheit AbsoluteDeviationEinheit { get; set; } /// /// This data class contains all the data required to start the PlausibilityReport generation. @@ -75,20 +76,20 @@ public class PlausibilityReportConfiguration /// /// reference time frame /// - [JsonProperty(Required = Required.AllowNull)] - public Zeitraum timeframe; + [JsonProperty(PropertyName = "timeframe", Required = Required.AllowNull)] + public Zeitraum Timeframe { get; set; } /// /// Energiemenge to be compared with the reference Energiemenge /// - [JsonProperty(Required = Required.Always)] - public Energiemenge other; + [JsonProperty(PropertyName = "other", Required = Required.Always)] + public Energiemenge Other { get; set; } /// - /// set true to ignore if Energiemenge do have different or + /// set true to ignore if Energiemenge do have different or /// - [JsonProperty(Required = Required.Always)] - public bool ignoreLocation; + [JsonProperty(PropertyName = "ignoreLocation", Required = Required.Always)] + public bool IgnoreLocation { get; set; } } } } diff --git a/BO4E-dotnet.Reporting/Report.cs b/BO4E-dotnet.Reporting/Report.cs index 510bc049..e6ace886 100644 --- a/BO4E-dotnet.Reporting/Report.cs +++ b/BO4E-dotnet.Reporting/Report.cs @@ -1,8 +1,10 @@ -using BO4E.BO; -using System; +using System; using System.Collections; using System.Collections.Generic; using System.Linq; + +using BO4E.BO; + using static BO4E.Reporting.CompletenessReport; namespace BO4E.Reporting @@ -85,7 +87,7 @@ public abstract class Report : BusinessObject } else { - int userPropertiesIndex = headerNames.IndexOf("userProperties"); + int userPropertiesIndex = headerNames.IndexOf(BusinessObject.USER_PROPERTIES_NAME); if (userPropertiesIndex >= 0) { headerNames.RemoveAt(userPropertiesIndex); @@ -131,7 +133,7 @@ public abstract class Report : BusinessObject } else { - throw new ArgumentException("invalid values", nameof(reihenfolge)); + throw new ArgumentException($"'{reihenItem.Keys.First()}' was not part of {nameof(headerNames)}=[{string.Join(", ", headerNames)}]", nameof(reihenfolge)); } } else @@ -142,7 +144,7 @@ public abstract class Report : BusinessObject } else { - int userPropertiesIndex = headerNames.IndexOf("userProperties"); + int userPropertiesIndex = headerNames.IndexOf(BusinessObject.USER_PROPERTIES_NAME); if (userPropertiesIndex >= 0) { headerNames.RemoveAt(userPropertiesIndex); @@ -193,17 +195,17 @@ public abstract class Report : BusinessObject private Dictionary, List> Detect(Type type, char separator, object value, Dictionary, List> returnData) { - var fields = type.GetFields(); - var fieldsList = fields.Where(s => !s.Name.StartsWith("_")).ToList(); + var props = type.GetProperties(); + var nonHiddenProps = props.Where(s => !s.Name.StartsWith("_")).ToList(); List d = returnData.Values.First(); List h = returnData.Keys.First(); - foreach (var field in fieldsList) + foreach (var field in nonHiddenProps) { - if (field.FieldType.IsSubclassOf(typeof(BO4E.COM.COM))) + if (field.PropertyType.IsSubclassOf(typeof(BO4E.COM.COM))) { - returnData = Detect(field.FieldType, separator, field.GetValue(value), returnData); + returnData = Detect(field.PropertyType, separator, field.GetValue(value), returnData); } - else if ((field.FieldType.IsGenericType && (field.FieldType.GetGenericTypeDefinition() == typeof(List<>)))) + else if ((field.PropertyType.IsGenericType && (field.PropertyType.GetGenericTypeDefinition() == typeof(List<>)))) { if (field.GetValue(value) != null && field.Name != "gaps") { @@ -231,14 +233,14 @@ private Dictionary, List> Detect(Type type, char separator, muterType = field.DeclaringType.Name + "."; } string val = nestedValue.ToString(); - if (field.FieldType == typeof(DateTime?)) + if (field.PropertyType == typeof(DateTime?)) { if (((DateTime?)nestedValue).HasValue) { val = ((DateTime?)nestedValue).Value.ToString("yyyy-MM-ddTHH:mm:ssZ"); } } - else if (field.FieldType == typeof(DateTime)) + else if (field.PropertyType == typeof(DateTime)) { val = ((DateTime)nestedValue).ToString("yyyy-MM-ddTHH:mm:ssZ"); } diff --git a/BO4E-dotnet/BO/Angebot.cs b/BO4E-dotnet/BO/Angebot.cs index 60bfd82b..275453d4 100644 --- a/BO4E-dotnet/BO/Angebot.cs +++ b/BO4E-dotnet/BO/Angebot.cs @@ -1,10 +1,13 @@ using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; + using BO4E.COM; using BO4E.ENUM; using BO4E.meta; + using Newtonsoft.Json; + using ProtoBuf; namespace BO4E.BO @@ -18,19 +21,19 @@ public class Angebot : BusinessObject /// /// Eindeutige Nummer des Angebotes. /// - [JsonProperty(Required = Required.Always, Order = 4)] + [JsonProperty(Required = Required.Always, Order = 4, PropertyName = "angebotsnummer")] [ProtoMember(4)] [DataCategory(DataCategory.FINANCE)] [BoKey] - public string angebotsnummer; + public string Angebotsnummer { get; set; } /// /// Referenz auf eine Anfrage oder Ausschreibung.Kann dem Empfänger des Angebotes bei Zuordnung des Angebotes zur Anfrage bzw.Ausschreibung helfen. /// - [JsonProperty(Required = Required.Default, Order = 5)] + [JsonProperty(Required = Required.Default, Order = 5, PropertyName = "anfragereferenz")] [ProtoMember(5)] [DataCategory(DataCategory.FINANCE)] - public string anfragereferenz; + public string Anfragereferenz { get; set; } /// /// Erstellungsdatum des Angebots, @@ -38,19 +41,19 @@ public class Angebot : BusinessObject /// /// 2017-12-24 /// - [JsonProperty(Required = Required.Always, Order = 6)] + [JsonProperty(Required = Required.Always, Order = 6, PropertyName = "angebotsdatum")] [ProtoMember(6)] [DataCategory(DataCategory.FINANCE)] // ToDo: handle this as DateTime object that serializes without the "time" in "DateTime" - public string angebotsdatum; + public string Angebotsdatum { get; set; } /// /// Sparte, für die das Angebot abgegeben wird (Strom/Gas). /// /// - [JsonProperty(Required = Required.Always, Order = 7)] + [JsonProperty(Required = Required.Always, Order = 7, PropertyName = "sparte")] [ProtoMember(7)] - public Sparte sparte; + public Sparte Sparte { get; set; } /// /// Bis zu diesem Zeitpunkt(Tag/Uhrzeit) inklusive gilt das Angebot @@ -58,55 +61,55 @@ public class Angebot : BusinessObject /// /// 2017-12-31 17:00:00 /// - [JsonProperty(Required = Required.Default, Order = 8)] + [JsonProperty(Required = Required.Default, Order = 8, PropertyName = "bindefrist")] [ProtoMember(8)] [DataCategory(DataCategory.FINANCE)] - public DateTime bindefrist; + public DateTime Bindefrist { get; set; } /// /// Link auf den Ersteller des Angebots. /// /// - [JsonProperty(Required = Required.Always, Order = 9)] + [JsonProperty(Required = Required.Always, Order = 9, PropertyName = "angebotgeber")] [ProtoMember(9)] [DataCategory(DataCategory.FINANCE)] - public Geschaeftspartner angebotgeber; + public Geschaeftspartner Angebotgeber { get; set; } /// /// Link auf den Empfänger des Angebots. /// /// - [JsonProperty(Required = Required.Always, Order = 10)] + [JsonProperty(Required = Required.Always, Order = 10, PropertyName = "angebotnehmer")] [ProtoMember(10)] [DataCategory(DataCategory.FINANCE)] - public Geschaeftspartner angebotnehmer; + public Geschaeftspartner Angebotnehmer { get; set; } /// /// Link auf die Person, die als Angebotsnehmer das Angebot angenommen hat. /// /// - [JsonProperty(Required = Required.Default, Order = 11)] + [JsonProperty(Required = Required.Default, Order = 11, PropertyName = "unterzeichnerAngebotsnehmer")] [ProtoMember(11)] [DataCategory(DataCategory.NAME)] - public Ansprechpartner unterzeichnerAngebotsnehmer; + public Ansprechpartner UnterzeichnerAngebotsnehmer { get; set; } /// /// Link auf die Person, die als Angebotsgeber das Angebots ausgestellt hat. /// /// - [JsonProperty(Required = Required.Default, Order = 12)] + [JsonProperty(Required = Required.Default, Order = 12, PropertyName = "unterzeichnerAngebotsgeber")] [ProtoMember(12)] [DataCategory(DataCategory.NAME)] - public Ansprechpartner unterzeichnerAngebotsgeber; + public Ansprechpartner UnterzeichnerAngebotsgeber { get; set; } /// /// Eine oder mehrere Varianten des Angebots mit den Angebotsteilen. Ein Angebot besteht mindestens aus einer Variante. /// /// - [JsonProperty(Required = Required.Default, Order = 13)] + [JsonProperty(Required = Required.Default, Order = 13, PropertyName = "varianten")] [ProtoMember(13)] [DataCategory(DataCategory.FINANCE)] [MinLength(1)] - public List varianten; + public List Varianten { get; set; } } } diff --git a/BO4E-dotnet/BO/Ansprechpartner.cs b/BO4E-dotnet/BO/Ansprechpartner.cs index e8c7a521..80615e0f 100644 --- a/BO4E-dotnet/BO/Ansprechpartner.cs +++ b/BO4E-dotnet/BO/Ansprechpartner.cs @@ -1,8 +1,11 @@ using System.Collections.Generic; + using BO4E.COM; using BO4E.ENUM; using BO4E.meta; + using Newtonsoft.Json; + using ProtoBuf; namespace BO4E.BO @@ -16,75 +19,75 @@ public class Ansprechpartner : BusinessObject /// /// Mögliche Anrede des Ansprechpartners /// - [JsonProperty(Required = Required.Default, Order = 4)] + [JsonProperty(Required = Required.Default, Order = 4, PropertyName = "anrede")] [ProtoMember(4)] [DataCategory(DataCategory.NAME)] - public Anrede? anrede; + public Anrede? Anrede { get; set; } /// /// Im Falle einer nicht standardisierten Anrede kann hier eine frei definierbare /// Anrede vorgegeben werden. Beispiel: "Sehr geehrte Frau Müller, sehr geehrter /// Herr Dr. Müller" /// - [JsonProperty(Required = Required.Default, Order = 5)] + [JsonProperty(Required = Required.Default, Order = 5, PropertyName = "inviduelleAnrede")] [ProtoMember(5)] [DataCategory(DataCategory.NAME)] - public string individuelleAnrede; + public string IndividuelleAnrede { get; set; } /// Möglicher Titel des Ansprechpartners - [JsonProperty(Required = Required.Default, Order = 6)] + [JsonProperty(Required = Required.Default, Order = 6, PropertyName = "titel")] [ProtoMember(6)] [DataCategory(DataCategory.NAME)] - public Titel? titel; + public Titel? Titel; /// Vorname des Ansprechpartners - [JsonProperty(Required = Required.Default, Order = 7)] + [JsonProperty(Required = Required.Default, Order = 7, PropertyName = "vorname")] [ProtoMember(7)] [DataCategory(DataCategory.NAME)] [BoKey] - public string vorname; + public string Vorname { get; set; } /// Nachname (Familienname) des Ansprechpartners - [JsonProperty(Required = Required.Always, Order = 8)] + [JsonProperty(Required = Required.Always, Order = 8, PropertyName = "nachname")] [ProtoMember(8)] [DataCategory(DataCategory.NAME)] [BoKey] - public string nachname; + public string Nachname { get; set; } /// E-Mail Adresse - [JsonProperty(Required = Required.Default, Order = 9)] + [JsonProperty(Required = Required.Default, Order = 9, PropertyName = "eMailAdresse")] [ProtoMember(9)] [DataCategory(DataCategory.ADDRESS)] - public string eMailAdresse; + public string EMailAdresse { get; set; } /// Weitere Informationen zum Ansprechpartner - [JsonProperty(Required = Required.Default, Order = 10)] + [JsonProperty(Required = Required.Default, Order = 10, PropertyName = "kommentar")] [ProtoMember(10)] [DataCategory(DataCategory.NAME)] - public string kommentar; + public string Kommentar { get; set; } /// Der Geschäftspartner, für den dieser Ansprechpartner modelliert wird. - [JsonProperty(Required = Required.Always, Order = 11)] + [JsonProperty(Required = Required.Always, Order = 11, PropertyName = "geschaeftspartner")] [ProtoMember(11)] [BoKey] - public Geschaeftspartner geschaeftspartner; + public Geschaeftspartner Geschaeftspartner { get; set; } /// Adresse des Ansprechpartners, falls diese von der Adresse des Geschäftspartners abweicht. - [JsonProperty(Required = Required.Default, Order = 12)] + [JsonProperty(Required = Required.Default, Order = 12, PropertyName = "adresse")] [ProtoMember(12)] [DataCategory(DataCategory.ADDRESS)] - public Adresse adresse; + public Adresse Adresse { get; set; } /// Liste der Telefonnummern, unter denen der Ansprechpartner erreichbar ist. - [JsonProperty(Required = Required.Default, Order = 13)] + [JsonProperty(Required = Required.Default, Order = 13, PropertyName = "rufnummer")] [ProtoMember(13)] [DataCategory(DataCategory.ADDRESS)] - public List rufnummer; + public List Rufnummer; /// Liste der Abteilungen und Zuständigkeiten des Ansprechpartners. - [JsonProperty(Required = Required.Default, Order = 14)] + [JsonProperty(Required = Required.Default, Order = 14, PropertyName = "zustaendigkeit")] [ProtoMember(14)] - public List zustaendigkeit; + public List Zustaendigkeit; } } diff --git a/BO4E-dotnet/BO/Benachrichtigung.cs b/BO4E-dotnet/BO/Benachrichtigung.cs index 59786f94..79600e40 100644 --- a/BO4E-dotnet/BO/Benachrichtigung.cs +++ b/BO4E-dotnet/BO/Benachrichtigung.cs @@ -1,10 +1,13 @@ using System; using System.Collections.Generic; using System.ComponentModel; + using BO4E.COM; using BO4E.ENUM; using BO4E.meta; + using Newtonsoft.Json; + using ProtoBuf; namespace BO4E.BO @@ -21,33 +24,33 @@ public class Benachrichtigung : BusinessObject /// Eine eindeutige ID der Benachrichtigung. /// Entspricht z.B. der Klärfallnummer in einem SAP-System oder der Task-ID im Salesforce /// - [JsonProperty(Required = Required.Always, Order = 4)] + [JsonProperty(Required = Required.Always, Order = 4, PropertyName = "benachrichtigungsId")] [ProtoMember(4)] [BoKey] - public string benachrichtigungsId; + public string BenachrichtigungsId { get; set; } /// /// Priorität der Benachrichtigung /// [DefaultValue(Prioritaet.NORMAL)] - [JsonProperty(Required = Required.Always, Order = 5)] + [JsonProperty(Required = Required.Always, Order = 5, PropertyName = "prioritaet")] [ProtoMember(5)] - public Prioritaet prioritaet; + public Prioritaet Prioritaet { get; set; } /// /// Status der Benachrichtigung /// [DefaultValue(Bearbeitungsstatus.OFFEN)] - [JsonProperty(Required = Required.Always, Order = 6)] + [JsonProperty(Required = Required.Always, Order = 6, PropertyName = "bearbeitungsstatus")] [ProtoMember(6)] - public Bearbeitungsstatus bearbeitungsstatus; + public Bearbeitungsstatus Bearbeitungsstatus { get; set; } /// /// Kurzbeschreibung des Fehlers (Klärfall-Überschrift im SAP, Subject im SFDC) /// - [JsonProperty(Required = Required.Always, Order = 7)] + [JsonProperty(Required = Required.Always, Order = 7, PropertyName = "kurztext")] [ProtoMember(7)] - public string kurztext; + public string Kurztext { get; set; } //[JsonIgnore] //private DateTime _erstellungsZeitpunkt; @@ -55,9 +58,9 @@ public class Benachrichtigung : BusinessObject /// Zeitpunkt zu dem die Benachrichtigung erstellt wurde (UTC). /// // [DefaultValue(DateTime.UtcNow)] <-- doesn't work. - [JsonProperty(Required = Required.Always, Order = 8)] + [JsonProperty(Required = Required.Always, Order = 8, PropertyName = "erstellungsZeitpunkt")] [ProtoMember(8)] - public DateTime erstellungsZeitpunkt; + public DateTime ErstellungsZeitpunkt { get; set; } /*{ get { return _erstellungsZeitpunkt; } set @@ -77,25 +80,25 @@ public class Benachrichtigung : BusinessObject /// Optionale Kategorisierung der Benachrichtigung. /// (Entspricht z.B. der Klärfallkategorie in SAP) /// - [JsonProperty(Required = Required.Default, Order = 9)] + [JsonProperty(Required = Required.Default, Order = 9, PropertyName = "kategorie")] [ProtoMember(9)] - public string kategorie; + public string Kategorie { get; set; } /// /// Eindeutige Kennung des Benutzers, der die Benachrichtigung erhält oder sie bearbeiten /// muss; analog dem Klärfallbearbeiter im SAP oder dem Owner im Salesforce. /// Kann auch null sein, wenn es keinen festen Bearbeiter gibt. /// - [JsonProperty(Required = Required.Default, Order = 10)] + [JsonProperty(Required = Required.Default, Order = 10, PropertyName = "bearbeiter")] [ProtoMember(10)] - public string bearbeiter; + public string Bearbeiter { get; set; } /// /// Detaillierte Beschreibung (Klärfall-Notizen im SAP, Description im SFDC) /// - [JsonProperty(Required = Required.Default, Order = 11)] + [JsonProperty(Required = Required.Default, Order = 11, PropertyName = "notizen")] [ProtoMember(11)] - public List notizen; + public List Notizen { get; set; } /* /// @@ -103,29 +106,29 @@ public class Benachrichtigung : BusinessObject /// [JsonProperty(Required = Required.Default, Order = 8)] [ProtoMember(8)] - public Bo4eUri betroffenesObjekt; + public Bo4eUri betroffenesObjekt { get;set; } */ /// /// Zeitpunkt bis zu dem die Benachrichtigung bearbeitet worden sein muss. /// - [JsonProperty(Required = Required.Default, Order = 12)] + [JsonProperty(Required = Required.Default, Order = 12, PropertyName = "deadline")] [ProtoMember(12)] - public DateTime? deadline; + public DateTime? Deadline { get; set; } /// /// Liste von Aktivitäten, die der Bearbeiter ausführen kann. /// - [JsonProperty(Required = Required.Default, Order = 13)] + [JsonProperty(Required = Required.Default, Order = 13, PropertyName = "aufgaben")] [ProtoMember(13)] - public List aufgaben; + public List Aufgaben { get; set; } /// /// list of additional information built in a customer dependet implementation /// - [JsonProperty(Required = Required.Default, Order = 14)] + [JsonProperty(Required = Required.Default, Order = 14, PropertyName = "infos")] [ProtoMember(14)] - public List infos; + public List Infos { get; set; } } } diff --git a/BO4E-dotnet/BO/BusinessObject.cs b/BO4E-dotnet/BO/BusinessObject.cs index bf0f0212..c21869fd 100644 --- a/BO4E-dotnet/BO/BusinessObject.cs +++ b/BO4E-dotnet/BO/BusinessObject.cs @@ -4,12 +4,15 @@ using System.Linq; using System.Reflection; using System.Runtime.Serialization; + using BO4E.meta; + using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Newtonsoft.Json.Schema; using Newtonsoft.Json.Schema.Generation; using Newtonsoft.Json.Serialization; + using ProtoBuf; namespace BO4E.BO @@ -46,9 +49,9 @@ public abstract class BusinessObject : IEquatable /// 'MESSLOKATION', /// 'MARKTLOKATION' /// - [JsonProperty(Required = Required.Default, Order = 1)] + [JsonProperty(Required = Required.Default, Order = 1, PropertyName = "boTyp")] [ProtoMember(1)] - public string boTyp; + public string BoTyp { get; set; } /// /// Fields that are not part of the BO4E-definition are stored in a element, that is @@ -81,31 +84,31 @@ public abstract class BusinessObject : IEquatable /// [JsonIgnore] [ProtoIgnore] - public const string userPropertiesName = "userProperties"; + public const string USER_PROPERTIES_NAME = "userProperties"; /// /// User properties (non bo4e standard) /// - [JsonProperty(PropertyName = userPropertiesName, Required = Required.Default, Order = 200)] + [JsonProperty(PropertyName = USER_PROPERTIES_NAME, Required = Required.Default, Order = 200)] [JsonExtensionData] [ProtoMember(200)] [DataCategory(DataCategory.USER_PROPERTIES)] - public IDictionary userProperties; + public IDictionary UserProperties { get; set; } /// /// generates the BO4E boTyp attribute value (class name as upper case) /// protected BusinessObject() { - boTyp = this.GetType().Name.ToUpper(); + BoTyp = this.GetType().Name.ToUpper(); versionStruktur = 1; } /// - /// return (as string, not as type) + /// return (as string, not as type) /// /// - public string GetBoTyp() => this.boTyp; + public string GetBoTyp() => this.BoTyp; /// /// This method is just to make sure the mapping actually makes sense. @@ -138,7 +141,7 @@ protected void SetBoTyp(string s) /// a JSON scheme public JSchema GetJsonScheme() { - return GetJsonScheme(this.GetType()); + return GetJsonSchema(this.GetType()); } /// @@ -147,7 +150,7 @@ public JSchema GetJsonScheme() /// a type derived from /// a JSON scheme /// - public static JSchema GetJsonScheme(Type boType) + public static JSchema GetJsonSchema(Type boType) { if (!boType.IsSubclassOf(typeof(BusinessObject))) { @@ -175,7 +178,7 @@ public Bo4eUri GetURI(bool includeUserProperties = false) /// names as they are serialised in JSON. This means that the fields PropertyName is part /// of the list if JsonPropertyAttribute.PropertyName is set in the Business Objects /// definition. Please do not use this method trying to access the actual key values. Use - /// the or for this purpose. + /// the or for this purpose. /// The list is sorted by the JsonPropertyAttribute.Order, assuming 0 if not specified. /// /// A list of the names (not the values) of the (composite) Business Object key or an empty list if no key attributes are defined. @@ -199,16 +202,16 @@ public List GetBoKeyNames() public static List GetBoKeyNames(Type boType) { List result = new List(); - foreach (FieldInfo fi in GetBoKeyFieldInfos(boType)) + foreach (var pi in GetBoKeyProps(boType)) { - JsonPropertyAttribute jpa = fi.GetCustomAttribute(); + JsonPropertyAttribute jpa = pi.GetCustomAttribute(); if (jpa != null && jpa.PropertyName != null) { result.Add(jpa.PropertyName); } else { - result.Add(fi.Name.ToString()); + result.Add(pi.Name.ToString()); } } return result; @@ -227,16 +230,16 @@ public static List GetBoKeyNames(Type boType) /// and the type of the property as value. Nesting and different layers are denoted by /// using "." /// - public static Dictionary GetExpandableFieldNames(Type boType) + public static Dictionary GetExpandablePropertyNames(Type boType) { - return GetExpandableFieldNames(boType, true); + return GetExpandablePropertyNames(boType, true); } /// - /// + /// /// /// name of the business object as string - /// + /// public static Dictionary GetExpandableFieldNames(string boTypeName) { Type clazz = Assembly.GetExecutingAssembly().GetType(BoMapper.packagePrefix + "." + boTypeName); @@ -244,7 +247,7 @@ public static Dictionary GetExpandableFieldNames(string boTypeName { throw new ArgumentException($"{boTypeName} is not a valid Business Object name. Use one of the following: {string.Join("\n -", BoMapper.GetValidBoNames())}"); } - return GetExpandableFieldNames(clazz); + return GetExpandablePropertyNames(clazz); } /// @@ -254,46 +257,47 @@ public static Dictionary GetExpandableFieldNames(string boTypeName /// Type inherited from Business Object /// true iff calling from outside the function itself / default /// HashSet of strings - protected static Dictionary GetExpandableFieldNames(Type type, bool rootLevel = true) + protected static Dictionary GetExpandablePropertyNames(Type type, bool rootLevel = true) { if (rootLevel && !type.IsSubclassOf(typeof(BO.BusinessObject))) { throw new ArgumentException("Only allowed for BusinessObjects"); } Dictionary result = new Dictionary(); - foreach (FieldInfo field in type.GetFields()) + foreach (var prop in type.GetProperties()) { string fieldName; - JsonPropertyAttribute jpa = field.GetCustomAttribute(); + JsonPropertyAttribute jpa = prop.GetCustomAttribute(); if (jpa != null && jpa.PropertyName != null) { fieldName = jpa.PropertyName; } else { - fieldName = field.Name; + fieldName = prop.Name; } - if (field.FieldType.IsSubclassOf(typeof(BO.BusinessObject))) + if (prop.PropertyType.IsSubclassOf(typeof(BO.BusinessObject))) { - foreach (KeyValuePair subResult in GetExpandableFieldNames(field.FieldType, false)) + foreach (KeyValuePair subResult in GetExpandablePropertyNames(prop.PropertyType, false)) + { result.Add(string.Join(".", new string[] { fieldName, subResult.Key }), subResult.Value); } - result.Add(fieldName, field.FieldType); + result.Add(fieldName, prop.PropertyType); } - else if (field.FieldType.IsSubclassOf(typeof(COM.COM))) + else if (prop.PropertyType.IsSubclassOf(typeof(COM.COM))) { - result.Add(fieldName, field.FieldType); + result.Add(fieldName, prop.PropertyType); // coms do not contain any exandable subfield since they're flat } - else if (field.FieldType.IsGenericType && field.FieldType.GetGenericTypeDefinition() == typeof(List<>)) + else if (prop.PropertyType.IsGenericType && prop.PropertyType.GetGenericTypeDefinition() == typeof(List<>)) { - Type listElementType = field.FieldType.GetGenericArguments()[0]; - foreach (KeyValuePair subResult in GetExpandableFieldNames(listElementType, false)) + Type listElementType = prop.PropertyType.GetGenericArguments()[0]; + foreach (KeyValuePair subResult in GetExpandablePropertyNames(listElementType, false)) { result.Add(string.Join(".", new string[] { fieldName, subResult.Key }), subResult.Value); } - result.Add(fieldName, field.FieldType); + result.Add(fieldName, prop.PropertyType); } else { @@ -308,21 +312,21 @@ protected static Dictionary GetExpandableFieldNames(Type type, boo /// The dictionary has the JsonPropertyAttribute.PropertyName or FieldName /// of the key as key and the actual key value as value. /// - /// + /// /// A dictionary with key value pairs. public Dictionary GetBoKeys() { Dictionary result = new Dictionary(); - foreach (FieldInfo fi in GetBoKeyFieldInfos(this.GetType())) + foreach (var pi in GetBoKeyProps(this.GetType())) { - JsonPropertyAttribute jpa = fi.GetCustomAttribute(); + JsonPropertyAttribute jpa = pi.GetCustomAttribute(); if (jpa != null && jpa.PropertyName != null) { - result.Add(jpa.PropertyName, fi.GetValue(this)); + result.Add(jpa.PropertyName, pi.GetValue(this)); } else { - result.Add(fi.Name, fi.GetValue(this)); + result.Add(pi.Name, pi.GetValue(this)); } } return result; @@ -334,16 +338,16 @@ public Dictionary GetBoKeys() /// /// Business Object type /// A list of FieldInfos to be used for accessing the key values. - public static List GetBoKeyFieldInfos(Type boType) + public static List GetBoKeyProps(Type boType) { if (!boType.IsSubclassOf(typeof(BusinessObject))) { throw new ArgumentException($"Business Object keys are only defined on Business Object types but {boType.ToString()} is not a Business Object."); } - return boType.GetFields() - .Where(f => f.GetCustomAttributes(typeof(BoKey), false).Length > 0) - .OrderBy(af => af.GetCustomAttribute()?.Order) - .ToList(); + return boType.GetProperties() + .Where(p => p.GetCustomAttributes(typeof(BoKey), false).Length > 0) + .OrderBy(ap => ap.GetCustomAttribute()?.Order) + .ToList(); } /// BO4E Business Objects are considered equal iff all of their elements/fields are equal. @@ -394,14 +398,14 @@ public override int GetHashCode() unchecked { result *= this.GetType().GetHashCode(); - foreach (FieldInfo field in this.GetType().GetFields()) + foreach (var prop in this.GetType().GetProperties()) { - if (field.GetValue(this) != null) + if (prop.GetValue(this) != null) { - if (field.GetValue(this).GetType().IsGenericType && field.GetValue(this).GetType().GetGenericTypeDefinition() == typeof(List<>)) + if (prop.GetValue(this).GetType().IsGenericType && prop.GetValue(this).GetType().GetGenericTypeDefinition() == typeof(List<>)) { - IEnumerable enumerable = field.GetValue(this) as IEnumerable; - Type listElementType = field.GetValue(this).GetType().GetGenericArguments()[0]; + IEnumerable enumerable = prop.GetValue(this) as IEnumerable; + Type listElementType = prop.GetValue(this).GetType().GetGenericArguments()[0]; Type listType = typeof(List<>).MakeGenericType(listElementType); int index = 0; foreach (object listItem in enumerable) @@ -415,7 +419,7 @@ public override int GetHashCode() { // Using + 19 because the default hash code of uninitialised enums is zero. // This would screw up the calculation such that all objects with at least one null value had the same hash code, namely 0. - result *= 19 + field.GetValue(this).GetHashCode(); + result *= 19 + prop.GetValue(this).GetHashCode(); } } } @@ -424,15 +428,15 @@ public override int GetHashCode() } /// - /// converts to upper case. + /// converts to upper case. /// /// [OnDeserialized] protected void DeserializationFixes(StreamingContext context) { - if (boTyp != null) + if (BoTyp != null) { - this.boTyp = boTyp.ToUpper(); + this.BoTyp = BoTyp.ToUpper(); } } @@ -512,12 +516,34 @@ public override object ReadJson(JsonReader reader, Type objectType, object exist throw new NotImplementedException($"The type '{jo["boTyp"].Value()}' does not exist in the BO4E standard."); } } - return JsonConvert.DeserializeObject(jo.ToString(), boType); + var deserializationMethod = serializer.GetType() // https://stackoverflow.com/a/5218492/10009545 + .GetMethods() + .Where(m => m.Name == nameof(serializer.Deserialize)) + .Select(m => new + { + Method = m, + Params = m.GetParameters(), + Args = m.GetGenericArguments() + }) + .Where(x => x.Params.Length == 1 + && x.Args.Length == 1) + .Select(x => x.Method) + .First() + .GetGenericMethodDefinition() + .MakeGenericMethod(new Type[] { boType }); + try + { + return deserializationMethod.Invoke(serializer, new object[] { jo.CreateReader() }); + } + catch (TargetInvocationException tie) when (tie.InnerException != null) + { + throw tie.InnerException; // to hide the reflection to the outside. + } } else { serializer.ContractResolver.ResolveContract(objectType).Converter = null; - return serializer.Deserialize(reader, objectType); + return serializer.Deserialize(JObject.Load(reader).CreateReader(), objectType); } } diff --git a/BO4E-dotnet/BO/Energiemenge.cs b/BO4E-dotnet/BO/Energiemenge.cs index fbcc7341..6215cb4b 100644 --- a/BO4E-dotnet/BO/Energiemenge.cs +++ b/BO4E-dotnet/BO/Energiemenge.cs @@ -4,11 +4,14 @@ using System.ComponentModel.DataAnnotations; using System.Linq; using System.Runtime.Serialization; + using BO4E.COM; using BO4E.ENUM; using BO4E.meta; + using Newtonsoft.Json; using Newtonsoft.Json.Linq; + using ProtoBuf; namespace BO4E.BO @@ -23,29 +26,29 @@ public class Energiemenge : BusinessObject /// Eindeutige Nummer der Marktlokation bzw. der Messlokation, zu der die Energiemenge gehört /// [DefaultValue("|null|")] - [JsonProperty(Required = Required.Always, Order = 4)] + [JsonProperty(PropertyName = "lokationsId", Required = Required.Always, Order = 4)] [ProtoMember(4)] [DataCategory(DataCategory.POD)] [BoKey] - public string lokationsId; + public string LokationsId { get; set; } /// /// Gibt an, ob es sich um eine Markt- oder Messlokation handelt. /// /// - [JsonProperty(Required = Required.Always, Order = 5)] + [JsonProperty(PropertyName = "lokationsTyp", Required = Required.Always, Order = 5)] [ProtoMember(5)] [DataCategory(DataCategory.POD)] - public Lokationstyp lokationstyp; + public Lokationstyp LokationsTyp { get; set; } /// /// Gibt den in einer Zeiteinheit an. /// - [JsonProperty(Order = 6)] + [JsonProperty(Order = 6, PropertyName = "energieverbrauch")] [ProtoMember(6)] [DataCategory(DataCategory.METER_READING)] [MinLength(1)] - public List energieverbrauch; + public List Energieverbrauch { get; set; } /// /// If energieverbrauch is null or not present, it is initialised with an empty list for easier handling (less null checks) elsewhere. @@ -54,18 +57,18 @@ public class Energiemenge : BusinessObject [OnDeserialized] protected void OnDeserialized(StreamingContext context) { - if (energieverbrauch == null) + if (Energieverbrauch == null) { - energieverbrauch = new List(); + Energieverbrauch = new List(); } - else if (energieverbrauch.Count > 0) + else if (Energieverbrauch.Count > 0) { - energieverbrauch = energieverbrauch + Energieverbrauch = Energieverbrauch .Select(v => Verbrauch.FixSapCdsBug(v)) - .Where(v => !(v.startdatum == DateTime.MinValue || v.enddatum == DateTime.MinValue)) - .Where(v => !(v.userProperties != null && v.userProperties.ContainsKey("invalid") && (bool)v.userProperties["invalid"] == true)) + .Where(v => !(v.Startdatum == DateTime.MinValue || v.Enddatum == DateTime.MinValue)) + .Where(v => !(v.UserProperties != null && v.UserProperties.ContainsKey("invalid") && (bool)v.UserProperties["invalid"] == true)) .ToList(); - if (userProperties != null && userProperties.TryGetValue(Verbrauch._SAP_PROFDECIMALS_KEY, out JToken profDecimalsRaw)) + if (UserProperties != null && UserProperties.TryGetValue(Verbrauch._SAP_PROFDECIMALS_KEY, out JToken profDecimalsRaw)) { var profDecimals = profDecimalsRaw.Value(); if (profDecimals > 0) @@ -73,13 +76,13 @@ protected void OnDeserialized(StreamingContext context) for (int i = 0; i < profDecimals; i++) { // or should I import math.pow() for this purpose? - foreach (Verbrauch v in energieverbrauch.Where(v => v.userProperties == null || !v.userProperties.ContainsKey(Verbrauch._SAP_PROFDECIMALS_KEY))) + foreach (Verbrauch v in Energieverbrauch.Where(v => v.UserProperties == null || !v.UserProperties.ContainsKey(Verbrauch._SAP_PROFDECIMALS_KEY))) { - v.wert /= 10.0M; + v.Wert /= 10.0M; } } } - userProperties.Remove(Verbrauch._SAP_PROFDECIMALS_KEY); + UserProperties.Remove(Verbrauch._SAP_PROFDECIMALS_KEY); } } } @@ -94,53 +97,53 @@ protected void OnDeserialized(StreamingContext context) /// new Energiemenge object public static Energiemenge operator +(Energiemenge em1, Energiemenge em2) { - if (em1.lokationsId != em2.lokationsId || em1.lokationstyp != em2.lokationstyp || em1.versionStruktur != em2.versionStruktur) + if (em1.LokationsId != em2.LokationsId || em1.LokationsTyp != em2.LokationsTyp || em1.versionStruktur != em2.versionStruktur) { - throw new InvalidOperationException($"You must not add the Energiemengen with different locations {em1.lokationsId} ({em1.lokationstyp}) (v{em1.versionStruktur}) vs. {em2.lokationsId} ({em2.lokationstyp}) (v{em2.versionStruktur})"); + throw new InvalidOperationException($"You must not add the Energiemengen with different locations {em1.LokationsId} ({em1.LokationsTyp}) (v{em1.versionStruktur}) vs. {em2.LokationsId} ({em2.LokationsTyp}) (v{em2.versionStruktur})"); } Energiemenge result = new Energiemenge() { - lokationsId = em1.lokationsId, - lokationstyp = em1.lokationstyp, + LokationsId = em1.LokationsId, + LokationsTyp = em1.LokationsTyp, versionStruktur = em1.versionStruktur, }; - if (em1.userProperties == null) + if (em1.UserProperties == null) { - result.userProperties = em2.userProperties; + result.UserProperties = em2.UserProperties; } - else if (em2.userProperties == null) + else if (em2.UserProperties == null) { - result.userProperties = em1.userProperties; + result.UserProperties = em1.UserProperties; } else { // there's no consistency check on user properties! - result.userProperties = new Dictionary(); - foreach (var kvp1 in em1.userProperties) + result.UserProperties = new Dictionary(); + foreach (var kvp1 in em1.UserProperties) { - result.userProperties.Add(kvp1); + result.UserProperties.Add(kvp1); } - foreach (var kvp2 in em2.userProperties) + foreach (var kvp2 in em2.UserProperties) { - if (!result.userProperties.ContainsKey(kvp2.Key)) + if (!result.UserProperties.ContainsKey(kvp2.Key)) { - result.userProperties.Add(kvp2); + result.UserProperties.Add(kvp2); } } } - if (em1.energieverbrauch == null || em1.energieverbrauch.Count == 0) + if (em1.Energieverbrauch == null || em1.Energieverbrauch.Count == 0) { - result.energieverbrauch = em2.energieverbrauch; + result.Energieverbrauch = em2.Energieverbrauch; } - else if (em2.energieverbrauch == null || em2.energieverbrauch.Count == 0) + else if (em2.Energieverbrauch == null || em2.Energieverbrauch.Count == 0) { - result.energieverbrauch = em1.energieverbrauch; + result.Energieverbrauch = em1.Energieverbrauch; } else { - result.energieverbrauch = new List(); - result.energieverbrauch.AddRange(em1.energieverbrauch); - result.energieverbrauch.AddRange(em2.energieverbrauch); + result.Energieverbrauch = new List(); + result.Energieverbrauch.AddRange(em1.Energieverbrauch); + result.Energieverbrauch.AddRange(em2.Energieverbrauch); } return result; } diff --git a/BO4E-dotnet/BO/Geschaeftspartner.cs b/BO4E-dotnet/BO/Geschaeftspartner.cs index d47b5f6e..eb44208f 100644 --- a/BO4E-dotnet/BO/Geschaeftspartner.cs +++ b/BO4E-dotnet/BO/Geschaeftspartner.cs @@ -1,9 +1,12 @@ using System; using System.Collections.Generic; + using BO4E.COM; using BO4E.ENUM; using BO4E.meta; + using Newtonsoft.Json; + using ProtoBuf; namespace BO4E.BO @@ -20,113 +23,113 @@ namespace BO4E.BO public class Geschaeftspartner : BusinessObject { /// Die Anrede für den GePa, Z.B. Herr. - [JsonProperty(Required = Required.Default, Order = 4)] + [JsonProperty(Required = Required.Default, Order = 4, PropertyName = "anrede")] [ProtoMember(4)] [FieldName("salutation", Language.EN)] - public Anrede? anrede; + public Anrede? Anrede { get; set; } /// /// title of name /// /// Dr. - [JsonProperty(Required = Required.Default, Order = 5)] + [JsonProperty(Required = Required.Default, Order = 5, PropertyName = "title")] [ProtoMember(1001)] - [Obsolete("Please use anrede instead or Ansprechpartner.individuelleAnrede")] + [Obsolete("Please use anrede instead or Ansprechpartner.individuelleAnrede", true)] [NonOfficial(NonOfficialCategory.CUSTOMER_REQUIREMENTS)] - public string title; + public string Title { get; set; } /// /// Erster Teil des Namens. Hier kann der Firmenname oder bei Privatpersonen /// beispielsweise der Nachname dargestellt werden. Beispiele: Yellow Strom GmbH /// oder Hagen /// - [JsonProperty(Required = Required.Default, Order = 6)] + [JsonProperty(Required = Required.Default, Order = 6, PropertyName = "name1")] [ProtoMember(6)] [DataCategory(DataCategory.NAME)] [BoKey] - public string name1; + public string Name1 { get; set; } /// /// Zweiter Teil des Namens. Hier kann der eine Erweiterung zum Firmennamen oder /// bei Privatpersonen beispielsweise der Vorname dargestellt werden. Beispiele: /// Bereich Süd oder Nina /// - [JsonProperty(Required = Required.Default, Order = 7)] + [JsonProperty(Required = Required.Default, Order = 7, PropertyName = "name2")] [ProtoMember(7)] [DataCategory(DataCategory.NAME)] - public string name2; + public string Name2 { get; set; } /// /// Dritter Teil des Namens. Hier können weitere Ergänzungen zum Firmennamen oder /// bei Privatpersonen Zusätze zum Namen dargestellt werden. Beispiele: und Afrika /// oder Sängerin /// - [JsonProperty(Required = Required.Default, Order = 8)] + [JsonProperty(Required = Required.Default, Order = 8, PropertyName = "name3")] [ProtoMember(8)] [DataCategory(DataCategory.NAME)] - public string name3; + public string Name3 { get; set; } /// /// Kennzeichnung ob es sich um einen Gewerbe/Unternehmen (gewerbeKennzeichnung = true) /// oder eine Privatperson handelt. (gewerbeKennzeichnung = false) /// - [JsonProperty(Required = Required.Always, Order = 9)] + [JsonProperty(Required = Required.Always, Order = 9, PropertyName = "gewerbekennzeichnung")] [ProtoMember(9)] [FieldName("isCommercial", Language.EN)] - public bool gewerbekennzeichnung; + public bool Gewerbekennzeichnung { get; set; } /// Handelsregisternummer des Geschäftspartners - [JsonProperty(Required = Required.Default, Order = 10)] + [JsonProperty(Required = Required.Default, Order = 10, PropertyName = "hrnummer")] [ProtoMember(10)] [DataCategory(DataCategory.LEGAL)] - public string hrnummer; + public string Hrnummer { get; set; } /// Amtsgericht bzw Handelsregistergericht, das die Handelsregisternummer herausgegeben hat - [JsonProperty(Required = Required.Default, Order = 11)] + [JsonProperty(Required = Required.Default, Order = 11, PropertyName = "amtsgericht")] [ProtoMember(11)] [DataCategory(DataCategory.LEGAL)] - public string amtsgericht; + public string Amtsgericht { get; set; } /// Bevorzugter Kontaktweg des Geschäftspartners. - [JsonProperty(Required = Required.Default, Order = 12)] + [JsonProperty(Required = Required.Default, Order = 12, PropertyName = "kontaktweg")] [ProtoMember(12)] - public List kontaktweg; + public List Kontaktweg { get; set; } /// Die Steuer-ID des Geschäftspartners. Beispiel: DE 813281825 - [JsonProperty(Required = Required.Default, Order = 13)] + [JsonProperty(Required = Required.Default, Order = 13, PropertyName = "umsatzsteuerId")] [ProtoMember(13)] [DataCategory(DataCategory.LEGAL)] - public string umsatzsteuerId; + public string UmsatzsteuerId { get; set; } /// * Die Gläubiger-ID welche im Zahlungsverkehr verwendet wird- Z.B. DE 47116789 - [JsonProperty(Required = Required.Default, Order = 14)] + [JsonProperty(Required = Required.Default, Order = 14, PropertyName = "glaeubigerId")] [ProtoMember(14)] [DataCategory(DataCategory.FINANCE)] - public string glaeubigerId; + public string GlaeubigerId { get; set; } /// E-Mail-Adresse des Ansprechpartners. Z.B. info@mp-energie.de - [JsonProperty(Required = Required.Default, Order = 15)] + [JsonProperty(Required = Required.Default, Order = 15, PropertyName = "eMailAdresse")] [ProtoMember(15)] [DataCategory(DataCategory.ADDRESS)] - public string eMailAdresse; + public string EMailAdresse { get; set; } /// Internetseite des Marktpartners. Beispiel: www.mp-energie.de - [JsonProperty(Required = Required.Default, Order = 16)] + [JsonProperty(Required = Required.Default, Order = 16, PropertyName = "website")] [ProtoMember(16)] [DataCategory(DataCategory.ADDRESS)] - public string website; + public string Website { get; set; } /// Rolle, die der Geschäftspartner hat (z.B. Interessent, Kunde). - [JsonProperty(Required = Required.Default, Order = 17)] // ToDo: it's actually required but I need it to work quickly + [JsonProperty(Required = Required.Default, Order = 17, PropertyName = "geschaeftspartnerrolle")] // ToDo: it's actually required but I need it to work quickly [FieldName("role", Language.EN)] [ProtoMember(17)] - public List geschaeftspartnerrolle; + public List Geschaeftspartnerrolle { get; set; } /// Adresse des Geschäftspartners, an der sich der Hauptsitz befindet. Details - [JsonProperty(Required = Required.Default, Order = 18)] + [JsonProperty(Required = Required.Default, Order = 18, PropertyName = "partneradresse")] [ProtoMember(18)] [FieldName("partnerAddress", Language.EN)] - public Adresse partneradresse; + public Adresse Partneradresse { get; set; } } } \ No newline at end of file diff --git a/BO4E-dotnet/BO/Kosten.cs b/BO4E-dotnet/BO/Kosten.cs index 8fd1fa0b..4bc1e867 100644 --- a/BO4E-dotnet/BO/Kosten.cs +++ b/BO4E-dotnet/BO/Kosten.cs @@ -1,9 +1,12 @@ using System.Collections.Generic; using System.ComponentModel.DataAnnotations; + using BO4E.COM; using BO4E.ENUM; using BO4E.meta; + using Newtonsoft.Json; + using ProtoBuf; namespace BO4E.BO @@ -15,45 +18,44 @@ namespace BO4E.BO public class Kosten : BusinessObject { /// - /// Klasse der Kosten, beispielsweise Fremdkosten. Details siehe + /// Klasse der Kosten, beispielsweise Fremdkosten. Details siehe /// - [JsonProperty(Required = Required.Always, Order = 4)] + [JsonProperty(Required = Required.Always, Order = 4, PropertyName = "kostenklasse")] [ProtoMember(4)] [DataCategory(DataCategory.FINANCE)] - public Kostenklasse kostenklasse; + public Kostenklasse Kostenklasse { get; set; } /// /// Für diesen Zeitraum wurden die Kosten ermittelt. Details siehe /// - [JsonProperty(Required = Required.Always, Order = 5)] + [JsonProperty(Required = Required.Always, Order = 5, PropertyName = "gueltigkeit")] [ProtoMember(5)] [DataCategory(DataCategory.FINANCE)] - public Zeitraum gueltigkeit; + public Zeitraum Gueltigkeit { get; set; } /// /// Die Gesamtsumme über alle Kostenblöcke und -positionen. Details siehe /// - [JsonProperty(Required = Required.Default, Order = 6)] + [JsonProperty(Required = Required.Default, Order = 6, PropertyName = "summeKosten")] [ProtoMember(6)] [DataCategory(DataCategory.FINANCE)] - // ToDo: handle this as DateTime object that serializes without the "time" in "DateTime" - public List summeKosten; + public List SummeKosten { get; set; } /// /// Eine Liste mit Kostenblöcken. In Kostenblöcken werden Kostenpositionen zusammengefasst. Beispiele: Netzkosten, Umlagen, Steuern etc. Details siehe /// - [JsonProperty(Required = Required.Always, Order = 7)] // at least 1 entry + [JsonProperty(Required = Required.Always, Order = 7, PropertyName = "kostenbloecke")] // at least 1 entry [ProtoMember(7)] [MinLength(1)] - public List kostenbloecke; + public List Kostenbloecke { get; set; } /// /// Hier sind die Details zu einer Kostenposition aufgeführt. Z.B.: /// Alliander Netz Heinsberg GmbH, 01.02.2018, 31.12.2018, Arbeitspreis HT, 3.660 kWh, 5,8200 ct/kWh, 213,01 €. Details siehe COM Kostenposition /// - [JsonProperty(Required = Required.Default, Order = 8)] + [JsonProperty(Required = Required.Default, Order = 8, PropertyName = "kostenpositionen")] [ProtoMember(8)] [DataCategory(DataCategory.FINANCE)] - public List kostenpositionen; + public List Kostenpositionen { get; set; } } } diff --git a/BO4E-dotnet/BO/LogObject/LogObject.cs b/BO4E-dotnet/BO/LogObject/LogObject.cs index e84ccceb..6c0ea509 100644 --- a/BO4E-dotnet/BO/LogObject/LogObject.cs +++ b/BO4E-dotnet/BO/LogObject/LogObject.cs @@ -1,6 +1,9 @@ using System; + using BO4E.meta; + using Newtonsoft.Json; + using ProtoBuf; namespace BO4E.BO @@ -12,22 +15,22 @@ public class LogObject : BusinessObject /// unique id of the log event /// [BoKey] - [JsonProperty(Required = Required.Always, Order = 4)] + [JsonProperty(Required = Required.Always, Order = 4, PropertyName = "id")] [ProtoMember(4)] - public string id; + public string Id { get; set; } /// /// date time at which the log event has been raised /// - [JsonProperty(Required = Required.Always, Order = 5)] + [JsonProperty(Required = Required.Always, Order = 5, PropertyName = "datetime")] [ProtoMember(5)] - public DateTime datetime; + public DateTime Datetime { get; set; } /// /// actual log message /// - [JsonProperty(Required = Required.Always, Order = 6)] + [JsonProperty(Required = Required.Always, Order = 6, PropertyName = "logMessage")] [ProtoMember(6)] - public string logMessage; + public string LogMessage { get; set; } } } diff --git a/BO4E-dotnet/BO/LogObject/LogObject.puml b/BO4E-dotnet/BO/LogObject/LogObject.puml new file mode 100644 index 00000000..352d45b0 --- /dev/null +++ b/BO4E-dotnet/BO/LogObject/LogObject.puml @@ -0,0 +1,8 @@ +@startuml +class LogObject { + + Id : string <> <> + + Datetime : DateTime <> <> + + LogMessage : string <> <> +} +BusinessObject <|-- LogObject +@enduml diff --git a/BO4E-dotnet/BO/Marktlokation.cs b/BO4E-dotnet/BO/Marktlokation.cs index b404057a..925de833 100644 --- a/BO4E-dotnet/BO/Marktlokation.cs +++ b/BO4E-dotnet/BO/Marktlokation.cs @@ -2,10 +2,13 @@ using System.Collections.Generic; using System.ComponentModel; using System.Text.RegularExpressions; + using BO4E.COM; using BO4E.ENUM; using BO4E.meta; + using Newtonsoft.Json; + using ProtoBuf; namespace BO4E.BO @@ -27,44 +30,44 @@ public class Marktlokation : BusinessObject /// verbraucht, oder erzeugt wird /// [DefaultValue("|null|")] - [JsonProperty(Required = Required.Always, Order = 4)] + [JsonProperty(Required = Required.Always, Order = 4, PropertyName = "marktlokationsId")] [DataCategory(DataCategory.POD)] [BoKey] [ProtoMember(4)] - public string marktlokationsId; + public string MarktlokationsId { get; set; } /// Sparte der Messlokation, z.B. Gas oder Strom. - [JsonProperty(Required = Required.Always, Order = 5)] + [JsonProperty(Required = Required.Always, Order = 5, PropertyName = "sparte")] [ProtoMember(5)] - public Sparte sparte; + public Sparte Sparte { get; set; } /// Kennzeichnung, ob Energie eingespeist oder entnommen (ausgespeist) wird. - [JsonProperty(Required = Required.Always, Order = 6)] + [JsonProperty(Required = Required.Always, Order = 6, PropertyName = "energierichtung")] [ProtoMember(6)] - public Energierichtung energierichtung; + public Energierichtung Energierichtung { get; set; } /// Kennzeichnung, ob Energie eingespeist oder entnommen (ausgespeist) wird. - [JsonProperty(Required = Required.Always, Order = 7)] + [JsonProperty(Required = Required.Always, Order = 7, PropertyName = "bilanzierungsmethode")] [ProtoMember(7)] - public Bilanzierungsmethode bilanzierungsmethode; + public Bilanzierungsmethode Bilanzierungsmethode { get; set; } /// Verbrauchsart der Marktlokation - [JsonProperty(Required = Required.Default, Order = 8)] + [JsonProperty(Required = Required.Default, Order = 8, PropertyName = "verbrauchsart")] [ProtoMember(8)] - public Verbrauchsart? verbrauchsart; + public Verbrauchsart? Verbrauchsart { get; set; } /// Gibt an, ob es sich um eine unterbrechbare Belieferung handelt. - [JsonProperty(Required = Required.Default, Order = 9)] + [JsonProperty(Required = Required.Default, Order = 9, PropertyName = "unterbrechbar")] [ProtoMember(9)] - public bool? unterbrechbar; + public bool? Unterbrechbar { get; set; } /// /// Netzebene, in der der Bezug der Energie erfolgt. Bei Strom Spannungsebene der /// Lieferung, bei Gas Druckstufe. Beispiel Strom: Niederspannung Beispiel Gas: /// Niederdruck. - /// - [JsonProperty(Required = Required.Always, Order = 10)] + /// + [JsonProperty(Required = Required.Always, Order = 10, PropertyName = "netzebene")] [ProtoMember(10)] - public Netzebene netzebene; + public Netzebene Netzebene { get; set; } /// /// Codenummer des Netzbetreibers, an dessen Netz diese Marktlokation @@ -72,119 +75,121 @@ public class Marktlokation : BusinessObject /// [JsonProperty(PropertyName = "netzbetreiberCodeNr", Required = Required.Default, Order = 11)] [ProtoMember(11)] - public string netzbetreibercodenr; + public string NetzbetreiberCodeNr { get; set; } /// Typ des Netzgebietes,z.B.Verteilnetz. /// https://github.com/Hochfrequenz/energy-service-hub/issues/11 [JsonProperty(PropertyName = "gebietTyp", Order = 12, Required = Required.Default)] [ProtoMember(12)] - public Gebiettyp? gebiettyp; + public Gebiettyp? GebietType { get; set; } /// Die Nummer des Netzgebietes in der ene't-Datenbank. [JsonProperty(PropertyName = "netzgebietNr", Order = 13, Required = Required.Default)] [ProtoMember(13)] - public string netzgebietnr; + public string NetzgebietNr { get; set; } /// Bilanzierungsgebiet, dem das Netzgebiet zugeordnet ist - im Falle eines Strom Netzes. - [JsonProperty(Required = Required.Default, Order = 14)] + [JsonProperty(Required = Required.Default, Order = 14, PropertyName = "bilanzierungsgebiet")] [ProtoMember(14)] - public string bilanzierungsgebiet; + public string Bilanzierungsgebiet { get; set; } /// CodeNummer des Grundversorgers, der für diese Marktlokation zuständig ist. [JsonProperty(PropertyName = "grundversorgerCodeNr", Order = 15, Required = Required.Default)] [ProtoMember(15)] - public string grundversorgercodenr; + public string GrundversorgerCodeNr { get; set; } - ///Die Gasqualität in diesem Netzgebiet. H-Gas oder L-Gas. Im Falle eines Gas-Netzes. */ - [JsonProperty(Required = Required.Default, Order = 16)] + ///Die Gasqualität in diesem Netzgebiet. H-Gas oder L-Gas. Im Falle eines Gas-Netzes. */ + [JsonProperty(Required = Required.Default, Order = 16, PropertyName = "gasqualitaet")] [ProtoMember(16)] - public Gasqualitaet? gasqualitaet; + public Gasqualitaet? Gasqualitaet { get; set; } /// Link zum Geschäftspartner, dem diese Marktlokation gehört. - [JsonProperty(Required = Required.Default, Order = 17)] + [JsonProperty(Required = Required.Default, Order = 17, NullValueHandling = NullValueHandling.Ignore, PropertyName = "endkunde")] [ProtoMember(17)] - public Geschaeftspartner endkunde; + public Geschaeftspartner Endkunde { get; set; } /// Die Adresse, an der die Energie-Lieferung oder -Einspeisung erfolgt. */ [DataCategory(DataCategory.ADDRESS)] - [JsonProperty(Required = Required.Default, Order = 18)] + [JsonProperty(Required = Required.Default, Order = 18, PropertyName = "lokationsadresse")] [ProtoMember(18)] - public Adresse lokationsadresse; + public Adresse Lokationsadresse { get; set; } /// Alternativ zu einer postalischen Adresse kann hier ein Ort mittels Geokoordinaten angegeben werden (z.B. zur Identifikation von Sendemasten). */ [DataCategory(DataCategory.ADDRESS)] - [JsonProperty(Required = Required.Default, Order = 19)] + [JsonProperty(Required = Required.Default, Order = 19, PropertyName = "geoadresse")] [ProtoMember(19)] - public Geokoordinaten geoadresse; + public Geokoordinaten Geoadresse { get; set; } /// Alternativ zu einer postalischen Adresse und Geokoordinaten kann hier eine Ortsangabe mittels Gemarkung und Flurstück erfolgen. [DataCategory(DataCategory.ADDRESS)] - [JsonProperty(Required = Required.Default, Order = 20)] + [JsonProperty(Required = Required.Default, Order = 20, PropertyName = "katasterinformation")] [ProtoMember(20)] - public Katasteradresse katasterinformation; + public Katasteradresse Katasterinformation { get; set; } /// /// für EDIFACT mapping /// - // ToDo: specify docstring. - [JsonProperty(Required = Required.Default, Order = 21)] + // ToDo: specify docstring / evaluate if necessary + [JsonProperty(Required = Required.Default, Order = 21, PropertyName = "marktrollen")] [ProtoMember(1021)] [NonOfficial(NonOfficialCategory.CUSTOMER_REQUIREMENTS)] - public List marktrollen; + [Obsolete("I'm pretty sure the BO.Marktlokation is not the right place to store this information. Please evaluate!")] + public List Marktrollen { get; set; } // ToDo: evaluate this /// /// für EDIFACT mapping /// // ToDo: specify docstring. - [JsonProperty(Required = Required.Default, Order = 22)] + [JsonProperty(Required = Required.Default, Order = 22, PropertyName = "regelzone")] [ProtoMember(1022)] [NonOfficial(NonOfficialCategory.CUSTOMER_REQUIREMENTS)] - public string regelzone; + public string Regelzone { get; set; } /// /// für EDIFACT mapping /// // ToDo: specify docstring. - [JsonProperty(Required = Required.Default, Order = 23)] + [JsonProperty(Required = Required.Default, Order = 23, PropertyName = "marktgebiet")] [ProtoMember(1023)] [NonOfficial(NonOfficialCategory.CUSTOMER_REQUIREMENTS)] - public string marktgebiet; + public string Marktgebiet { get; set; } /// /// für EDIFACT mapping /// // ToDo: specify docstring. - [JsonProperty(Required = Required.Default, Order = 24)] + [JsonProperty(Required = Required.Default, Order = 24, PropertyName = "zeitreihentyp")] [ProtoMember(1024)] [NonOfficial(NonOfficialCategory.CUSTOMER_REQUIREMENTS)] - public Zeitreihentyp? zeitreihentyp; + public Zeitreihentyp? Zeitreihentyp { get; set; } /// /// für EDIFACT mapping /// // ToDo: specify docstring. - [JsonProperty(Required = Required.Default, Order = 25)] + [JsonProperty(Required = Required.Default, Order = 25, PropertyName = "zaehlwerke")] [ProtoMember(1025)] [NonOfficial(NonOfficialCategory.CUSTOMER_REQUIREMENTS)] - public List zaehlwerke; + public List Zaehlwerke { get; set; } /// /// für EDIFACT mapping /// - // ToDo: specify docstring. - [JsonProperty(Required = Required.Default, Order = 26)] + // ToDo: specify docstring / check if needed + [JsonProperty(Required = Required.Default, Order = 26, PropertyName = "verbrauchsmenge")] [ProtoMember(1026)] [NonOfficial(NonOfficialCategory.CUSTOMER_REQUIREMENTS)] - public List verbauchsmenge; + [Obsolete("Consider if this is really the right place to store the information. I think Energiemenge->energieverbrauch is better suited.")] + public List Verbrauchsmenge { get; set; } /// /// für EDIFACT mapping /// // ToDo: specify docstring. - [JsonProperty(Required = Required.Default, Order = 27)] + [JsonProperty(Required = Required.Default, Order = 27, PropertyName = "messlokationen")] [ProtoMember(1027)] [NonOfficial(NonOfficialCategory.CUSTOMER_REQUIREMENTS)] - public List messlokationen; + public List Messlokationen { get; set; } /// Aufzählung der Messlokationen, die zu dieser Marktlokation gehören. /// Es können 3 verschiedene Konstrukte auftreten: @@ -209,9 +214,9 @@ public class Marktlokation : BusinessObject /// einer Messlokation zum Verbrauch einer Marktlokation beitrögt mit aufgeführt. /// Der Standard ist hier die Addition. [DataCategory(DataCategory.POD)] - [JsonProperty(Required = Required.Default, Order = 28)] + [JsonProperty(Required = Required.Default, Order = 28, PropertyName = "zugehoerigeMesslokationen")] [ProtoMember(28)] - public List zugehoerigeMesslokationen; + public List ZugehoerigeMesslokationen { get; set; } /// @@ -295,7 +300,7 @@ public static string GetChecksum(string input) /// if marktlokaionsId matches the expected format public bool HasValidId() { - return ValidateId(this.marktlokationsId); + return ValidateId(this.MarktlokationsId); } /// diff --git a/BO4E-dotnet/BO/Marktteilnehmer.cs b/BO4E-dotnet/BO/Marktteilnehmer.cs index 0405d39f..f7c06e8f 100644 --- a/BO4E-dotnet/BO/Marktteilnehmer.cs +++ b/BO4E-dotnet/BO/Marktteilnehmer.cs @@ -1,7 +1,7 @@ using BO4E.ENUM; using BO4E.meta; + using Newtonsoft.Json; -using ProtoBuf; namespace BO4E.BO { @@ -13,35 +13,35 @@ namespace BO4E.BO public class Marktteilnehmer : Geschaeftspartner { /// Gibt im Klartext die Bezeichnung der Marktrolle an. - [JsonProperty(Required = Required.Always, Order = 19)] + [JsonProperty(Required = Required.Always, Order = 19, PropertyName = "marktrolle")] //[ProtoMember(19)] - public Marktrolle marktrolle; + public Marktrolle Marktrolle { get; set; } /// Gibt die Codenummer der Marktrolle an. [BoKey(true)] - [JsonProperty(Required = Required.Always, Order = 20)] + [JsonProperty(Required = Required.Always, Order = 20, PropertyName = "rollencodenummer")] //[ProtoMember(20)] - public string rollencodenummer; + public string Rollencodenummer { get; set; } /// Gibt den Typ des Codes an. - [JsonProperty(Required = Required.Always, Order = 21)] + [JsonProperty(Required = Required.Always, Order = 21, PropertyName = "rollencodetyp")] //[ProtoMember(21)] - public Rollencodetyp rollencodetyp; + public Rollencodetyp Rollencodetyp { get; set; } /// /// Die 1:1-Kommunikationsadresse des Marktteilnehmers. Diese wird in der /// Marktkommunikation verwendet. /// - [JsonProperty(Required = Required.Always, Order = 22)] + [JsonProperty(Required = Required.Always, Order = 22, PropertyName = "makoadresse")] //[ProtoMember(22)] - public string makoadresse; + public string Makoadresse { get; set; } /// /// Ansprechpartner as in EDIFACT NAD+MS, that includes e.g. the email address of a natural person. /// [NonOfficial(NonOfficialCategory.CUSTOMER_REQUIREMENTS)] - [JsonProperty(Required = Required.Default, Order = 23)] + [JsonProperty(Required = Required.Default, Order = 23, PropertyName = "ansprechpartner")] //[ProtoMember(23)] - public Ansprechpartner ansprechpartner; + public Ansprechpartner Ansprechpartner { get; set; } } } \ No newline at end of file diff --git a/BO4E-dotnet/BO/Messlokation.cs b/BO4E-dotnet/BO/Messlokation.cs index 7bb9e308..71f7dafa 100644 --- a/BO4E-dotnet/BO/Messlokation.cs +++ b/BO4E-dotnet/BO/Messlokation.cs @@ -2,10 +2,13 @@ using System.Collections.Generic; using System.ComponentModel; using System.Text.RegularExpressions; + using BO4E.COM; using BO4E.ENUM; using BO4E.meta; + using Newtonsoft.Json; + using ProtoBuf; namespace BO4E.BO @@ -25,132 +28,134 @@ public class Messlokation : BusinessObject /// Die Messlokations-Identifikation. Das ist die frühere Zählpunktbezeichnung, /// z.B. DE 47108151234567 [DefaultValue("|null|")] - [JsonProperty(PropertyName = "messLokationsId", Required = Required.Always, Order = 4)] + [JsonProperty(PropertyName = "messlokationsId", Required = Required.Always, Order = 4)] [DataCategory(DataCategory.POD)] [BoKey] [ProtoMember(4)] - public string messlokationsId; + public string MesslokationsId { get; set; } /// * Sparte der Messlokation, z.B. Gas oder Strom. - /// - [JsonProperty(Required = Required.Always, Order = 5)] + /// + [JsonProperty(PropertyName = "sparte", Required = Required.Always, Order = 5)] [ProtoMember(5)] - public Sparte sparte; + public Sparte Sparte { get; set; } /// Spannungsebene der Messung. - [JsonProperty(Required = Required.Default, Order = 6)] //explicitly set NOT required. + [JsonProperty(PropertyName = "netzebeneMessung", Required = Required.Default, Order = 6)] //explicitly set NOT required. [ProtoMember(6)] - public Netzebene? netzebeneMessung; + + public Netzebene? NetzebeneMessung { get; set; } /// Die Nummer des Messgebietes in der ene't-Datenbank. - [JsonProperty(Required = Required.Default, Order = 7)] + [JsonProperty(PropertyName = "messgebietNr", Required = Required.Default, Order = 7)] [ProtoMember(7)] - public string messgebietNr; + public string MessgebietNr { get; set; } /// Codenummer des grundzuständigen Messstellenbetreibers, der für diese /// Messlokation zuständig ist.( Dieser ist immer dann Messstellenbetreiber, wenn /// kein anderer MSB die Einrichtungen an der Messlokation betreibt.) - [JsonProperty(Required = Required.Default, Order = 8)] + [JsonProperty(PropertyName = "grundzustaendigerMSBCodeNr", Required = Required.Default, Order = 8)] [ProtoMember(8)] - public string grundzustaendigerMSBCodeNr; + public string GrundzustaendigerMSBCodeNr { get; set; } /// Codenummer des grundzuständigen Messstellenbetreibers für intelligente /// Messsysteme der für diese Messlokation zuständig ist.(Dieser ist immer dann /// Messstellenbetreiber, wenn kein anderer MSB die Einrichtungen an der /// Messlokation betreibt.) - [JsonProperty(Required = Required.Default, Order = 9)] + [JsonProperty(PropertyName = "grundzustaendigerMSBIMCodeNr", Required = Required.Default, Order = 9)] [ProtoMember(9)] - public string grundzustaendigerMSBIMCodeNr;// grundzustaendigerMSB_IMCodenr; https://github.com/Hochfrequenz/energy-service-hub/issues/11 + public string GrundzustaendigerMSBIMCodeNr { get; set; }// grundzustaendigerMSB_IMCodenr; https://github.com/Hochfrequenz/energy-service-hub/issues/11 /// Codenummer des Messdienstleisters, der für diese Messlokation zuständig /// ist.( Dieser ist immer dann Messdienstleister, wenn kein anderer MDL die /// Messlokation abliest.) /// - [JsonProperty(PropertyName = "grundzustaendigerMDLodeNr", Order = 10, Required = Required.Default)] + [JsonProperty(PropertyName = "grundzustaendigerMDLCodeNr", Order = 10, Required = Required.Default)] [NonOfficial(NonOfficialCategory.PROPOSED_DELETION)] [ProtoMember(10)] [Obsolete("MDL is deprecated.", true)] - public string grundzustaendigerMDLCodeNr; + public string GrundzustaendigerMDLCodeNr { get; set; } /// Die Adresse, an der die Messeinrichtungen zu finden sind.( Nur angeben, wenn /// diese von der Adresse der Marktlokation abweicht.) /// Achtung: Es darf immer nur eine Art der Ortsangabe vorhanden sein (entweder /// eine Adresse oder eine GeoKoordinate oder eine Katasteradresse. /// - [JsonProperty(Required = Required.Default, Order = 11)] + [JsonProperty(PropertyName = "messadresse", Required = Required.Default, Order = 11)] [DataCategory(DataCategory.ADDRESS)] [ProtoMember(11)] - public Adresse messadresse; + public Adresse Messadresse { get; set; } /// Alternativ zu einer postalischen Adresse kann hier ein Ort mittels /// Geokoordinaten angegeben werden (z.B. zur Identifikation von Sendemasten). /// Achtung: Es darf immer nur eine Art der Ortsangabe vorhanden sein (entweder /// eine Adresse oder eine GeoKoordinate oder eine Katasteradresse. - [JsonProperty(Required = Required.Default, Order = 12)] + [JsonProperty(PropertyName = "geoadresse", Required = Required.Default, Order = 12)] [DataCategory(DataCategory.ADDRESS)] [ProtoMember(12)] - public Geokoordinaten geoadresse; + public Geokoordinaten Geoadresse { get; set; } /// Alternativ zu einer postalischen Adresse und Geokoordinaten kann hier eine /// Ortsangabe mittels Gemarkung und Flurstück erfolgen. /// Achtung: Es darf immer nur eine Art der Ortsangabe vorhanden sein (entweder /// eine Adresse oder eine GeoKoordinate oder eine Katasteradresse. */ - [JsonProperty(Required = Required.Default, Order = 13)] + [JsonProperty(PropertyName = "katasterinformation", Required = Required.Default, Order = 13)] [ProtoMember(13)] [DataCategory(DataCategory.ADDRESS)] - public Katasteradresse katasterinformation; + public Katasteradresse Katasterinformation { get; set; } /// Liste der Hardware, die zu dieser Messstelle gehört. - [JsonProperty(Required = Required.Default, Order = 14)] + [JsonProperty(PropertyName = "geraete", Required = Required.Default, Order = 14)] [ProtoMember(14)] - public List geraete; + public List Geraete { get; set; } /// Liste der Messdienstleistungen, die zu dieser Messstelle gehört. - [JsonProperty(Required = Required.Default, Order = 15)] + [JsonProperty(PropertyName = "messdienstleistung", Required = Required.Default, Order = 15)] [ProtoMember(15)] - public List messdienstleistung; + public List Messdienstleistung { get; set; } /// Zähler, die zu dieser Messlokation gehören. Details - [JsonProperty(Required = Required.Default, Order = 16)] + [JsonProperty(PropertyName = "messlokationszaehler", Required = Required.Default, Order = 16)] [ProtoMember(16)] - public List messlokationszaehler; + public List Messlokationszaehler { get; set; } /// - /// + /// /// - [JsonProperty(Required = Required.Default, Order = 17)] + [JsonProperty(PropertyName = "bilanzierungsmethode", Required = Required.Default, Order = 17)] [ProtoMember(17)] - public Bilanzierungsmethode? bilanzierungsmethode; + public Bilanzierungsmethode? Bilanzierungsmethode { get; set; } /// Dieser Wert ist true, falls die Abrechnungs des Messstellenbetriebs die Netznutzungsabrechnung enthält. false andernfalls - [JsonProperty(Required = Required.Default, Order = 18)] + [JsonProperty(PropertyName = "abrechnungmessstellenbetriebnna", Required = Required.Default, Order = 18)] [ProtoMember(1018)] [NonOfficial(NonOfficialCategory.CUSTOMER_REQUIREMENTS)] - public bool? abrechnungmessstellenbetriebnna; + public bool? Abrechnungmessstellenbetriebnna { get; set; } /// /// marktrollen für EDIFACT mapping /// - [JsonProperty(Required = Required.Default, Order = 19)] + [JsonProperty(Required = Required.Default, Order = 19, PropertyName = "marktrollen")] [ProtoMember(1019)] [NonOfficial(NonOfficialCategory.CUSTOMER_REQUIREMENTS)] - public List marktrollen; + [Obsolete("This isn't the right place for this information")] // ToDo: check + public List Marktrollen { get; set; } /// /// gasqualitaet für EDIFACT mapping /// - [JsonProperty(Required = Required.Default, Order = 20, NullValueHandling = NullValueHandling.Ignore)] + [JsonProperty(PropertyName = "gasqualitaet", Required = Required.Default, Order = 20, NullValueHandling = NullValueHandling.Ignore)] [ProtoMember(1020)] [NonOfficial(NonOfficialCategory.CUSTOMER_REQUIREMENTS)] - public Gasqualitaet? gasqualitaet; + public Gasqualitaet? Gasqualitaet { get; set; } /// /// verlustfaktor für EDIFACT mapping /// // ToDo: so does this mean that a factor of 0.0M has no losses? - [JsonProperty(Required = Required.Default, Order = 21)] + [JsonProperty(PropertyName = "verlustfaktor", Required = Required.Default, Order = 21)] [NonOfficial(NonOfficialCategory.CUSTOMER_REQUIREMENTS)] [ProtoMember(1021)] - public decimal? verlustfaktor; + public decimal? Verlustfaktor { get; set; } [JsonIgnore] private static readonly Regex REGEX_VALIDATE = new Regex(@"[A-Z\d]{33}", RegexOptions.Compiled); @@ -170,18 +175,18 @@ public static bool ValidateId(string id) } /// - /// Test if the is valid. + /// Test if the is valid. /// /// if messlokationsId matches the expected format public bool HasValidId() { - return ValidateId(this.messlokationsId); + return ValidateId(this.MesslokationsId); } /// - /// same as if is false but by default additionally checks if the is valid using . + /// same as if is false but by default additionally checks if the is valid using . /// - /// validate the , too + /// validate the , too /// true if the marktlokation is valid public bool IsValid(bool checkId = true) { diff --git a/BO4E-dotnet/BO/Preisblatt.cs b/BO4E-dotnet/BO/Preisblatt.cs index b097f457..f5fcbcb9 100644 --- a/BO4E-dotnet/BO/Preisblatt.cs +++ b/BO4E-dotnet/BO/Preisblatt.cs @@ -1,8 +1,10 @@ using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; + using BO4E.COM; using BO4E.meta; + using Newtonsoft.Json; + using ProtoBuf; namespace BO4E.BO @@ -22,34 +24,34 @@ public class Preisblatt : BusinessObject /// /// Eine Bezeichnung für das Preisblatt. /// - [JsonProperty(Required = Required.Always, Order = 4)] + [JsonProperty(Required = Required.Always, Order = 4, PropertyName = "bezeichnung")] [ProtoMember(4)] [DataCategory(DataCategory.FINANCE)] [BoKey] - public string bezeichnung; + public string Bezeichnung { get; set; } /// /// Der Zeitraum für den der Preis festgelegt ist. Details siehe /// - [JsonProperty(Required = Required.Always, Order = 5)] + [JsonProperty(Required = Required.Always, Order = 5, PropertyName = "gueltigkeit")] [ProtoMember(5)] [DataCategory(DataCategory.FINANCE)] - public Zeitraum gueltigkeit; + public Zeitraum Gueltigkeit { get; set; } /// /// Die einzelnen Positionen, die mit dem Preisblatt abgerechnet werden können. Z.B. Arbeitspreis, Grundpreis etc. Details siehe /// - [JsonProperty(Required = Required.Always, Order = 6)] // at least one entry + [JsonProperty(Required = Required.Always, Order = 6, PropertyName = "preispositionen")] // at least one entry [DataCategory(DataCategory.FINANCE)] [ProtoMember(6)] - public List preispositionen; + public List Preispositionen { get; set; } /*/// /// Staffelgrenzen der jeweiligen Preise. Details siehe /// [JsonProperty(Required = Required.Always, Order = 6)] // at least 1 entry [DataCategory(DataCategory.FINANCE)] - public List preisstaffeln;*/ + public List preisstaffeln { get;set; }*/ // https://github.com/Hochfrequenz/energy-service-hub/issues/11 } } diff --git a/BO4E-dotnet/BO/PreisblattDienstleistung.cs b/BO4E-dotnet/BO/PreisblattDienstleistung.cs index 8ac5afc3..bebb9283 100644 --- a/BO4E-dotnet/BO/PreisblattDienstleistung.cs +++ b/BO4E-dotnet/BO/PreisblattDienstleistung.cs @@ -1,6 +1,6 @@ using BO4E.ENUM; + using Newtonsoft.Json; -using ProtoBuf; namespace BO4E.BO { @@ -13,22 +13,22 @@ public class PreisblattDienstleistung : Preisblatt /// /// Hier kann der Preis noch auf bestimmte Dienstleistungsbereiche eingegrenzt werden. Z.B. Sperrung/Entsperrung. /// - [JsonProperty(Required = Required.Always, Order = 7)] + [JsonProperty(Required = Required.Always, Order = 7, PropertyName = "dienstleistungsdetails")] //[ProtoMember(7)] - public Dienstleistungstyp dienstleistungsdetails; + public Dienstleistungstyp Dienstleistungsdetails { get; set; } /// /// Hier kann der Preis auf bestimmte Geräte eingegrenzt werden. Z.B. auf die Zählergröße. /// - [JsonProperty(Required = Required.Default, Order = 8)] + [JsonProperty(Required = Required.Default, Order = 8, PropertyName = "geraetedetails")] //[ProtoMember(8)] - public Bilanzierungsmethode? geraetedetails; + public Bilanzierungsmethode? Geraetedetails { get; set; } /// /// Der Netzbetreiber oder Messstellenbetreiber, der die Preise veröffentlicht hat. /// - [JsonProperty(Required = Required.Always, Order = 9)] + [JsonProperty(Required = Required.Always, Order = 9, PropertyName = "herausgeber")] //[ProtoMember(9)] - public Marktteilnehmer herausgeber; + public Marktteilnehmer Herausgeber { get; set; } } } diff --git a/BO4E-dotnet/BO/PreisblattKonzessionsabgabe.cs b/BO4E-dotnet/BO/PreisblattKonzessionsabgabe.cs index 97854d84..6d5b0b4a 100644 --- a/BO4E-dotnet/BO/PreisblattKonzessionsabgabe.cs +++ b/BO4E-dotnet/BO/PreisblattKonzessionsabgabe.cs @@ -1,6 +1,6 @@ using BO4E.ENUM; + using Newtonsoft.Json; -using ProtoBuf; namespace BO4E.BO { @@ -13,15 +13,15 @@ public class PreisblattKonzessionsabgabe : Preisblatt /// /// Sparte, auf die sich die KA bezieht. /// - [JsonProperty(Required = Required.Always, Order = 7)] + [JsonProperty(Required = Required.Always, Order = 7, PropertyName = "sparte")] //[ProtoMember(7)] - public Sparte sparte; + public Sparte sparte { get; set; } /// /// Kundegruppe anhand derer die Höhe der Konzessionsabgabe festgelegt ist. /// - [JsonProperty(Required = Required.Always, Order = 8)] + [JsonProperty(Required = Required.Always, Order = 8, PropertyName = "kundengruppeKA")] //[ProtoMember(8)] - public KundengruppeKA kundengruppeKA; + public KundengruppeKA KundengruppeKA { get; set; } } } diff --git a/BO4E-dotnet/BO/PreisblattMessung.cs b/BO4E-dotnet/BO/PreisblattMessung.cs index 107cb0bd..de5c7c2c 100644 --- a/BO4E-dotnet/BO/PreisblattMessung.cs +++ b/BO4E-dotnet/BO/PreisblattMessung.cs @@ -1,8 +1,9 @@ using System.Collections.Generic; + using BO4E.COM; using BO4E.ENUM; + using Newtonsoft.Json; -using ProtoBuf; namespace BO4E.BO { @@ -15,50 +16,50 @@ public class PreisblattMessung : Preisblatt /// /// Preisblatt gilt für die angegebene Sparte. /// - [JsonProperty(Required = Required.Always, Order = 7)] + [JsonProperty(Required = Required.Always, Order = 7, PropertyName = "sparte")] //[ProtoMember(7)] - public Sparte sparte; + public Sparte Sparte { get; set; } /// /// Die Preise gelten für Marktlokationen der angegebenen Bilanzierungsmethode. /// - [JsonProperty(Required = Required.Always, Order = 8)] + [JsonProperty(Required = Required.Always, Order = 8, PropertyName = "bilanzierungsmethode")] //[ProtoMember(8)] - public Bilanzierungsmethode bilanzierungsmethode; + public Bilanzierungsmethode Bilanzierungsmethode { get; set; } /// /// Die Preise gelten für Messlokationen in der angegebenen Netzebene. /// - [JsonProperty(Required = Required.Always, Order = 9)] + [JsonProperty(Required = Required.Always, Order = 9, PropertyName = "messebene")] //[ProtoMember(9)] - public Netzebene messebene; + public Netzebene Messebene { get; set; } /// /// Im Preis sind die hier angegebenen Dienstleistungen enthalten. Z.B. Jährliche Ablesung. /// - [JsonProperty(Required = Required.Default, Order = 10)] + [JsonProperty(Required = Required.Default, Order = 10, PropertyName = "inklusiveDienstleistung")] //[ProtoMember(10)] - public List inklusiveDienstleistung; + public List InklusiveDienstleistung { get; set; } /// /// Der Preis betrifft das hier angegebene Geräte, z.B. einen Drehstromzähler. /// - [JsonProperty(Required = Required.Always, Order = 11)] + [JsonProperty(Required = Required.Always, Order = 11, PropertyName = "basisgeraet")] //[ProtoMember(11)] - public Geraeteeigenschaften basisgeraet; + public Geraeteeigenschaften Basisgeraet { get; set; } /// /// Im Preis sind die hier angegebenen Geräte mit enthalten, z.B. ein Wandler. /// - [JsonProperty(Required = Required.Default, Order = 12)] + [JsonProperty(Required = Required.Default, Order = 12, PropertyName = "inklusiveGeraete")] //[ProtoMember(12)] - public List inklusiveGeraete; + public List InklusiveGeraete { get; set; } /// /// Der Netzbetreiber oder Messstellenbetreiber, der die Preise veröffentlicht hat. /// - [JsonProperty(Required = Required.Always, Order = 13)] + [JsonProperty(Required = Required.Always, Order = 13, PropertyName = "herausgeber")] //[ProtoMember(13)] - public Marktteilnehmer herausgeber; + public Marktteilnehmer Herausgeber { get; set; } } } diff --git a/BO4E-dotnet/BO/PreisblattNetznutzung.cs b/BO4E-dotnet/BO/PreisblattNetznutzung.cs index 65039656..e6b515c4 100644 --- a/BO4E-dotnet/BO/PreisblattNetznutzung.cs +++ b/BO4E-dotnet/BO/PreisblattNetznutzung.cs @@ -13,36 +13,36 @@ public class PreisblattNetznutzung : Preisblatt /// /// Preisblatt gilt für angegebene Sparte. /// - [JsonProperty(Required = Required.Always, Order = 7)] + [JsonProperty(Required = Required.Always, Order = 7, PropertyName="sparte")] //[ProtoMember(7)] - public Sparte sparte; + public Sparte Sparte { get;set; } /// /// Die Preise gelten für Marktlokationen der angegebenen Bilanzierungsmethode. /// - [JsonProperty(Required = Required.Always, Order = 8)] + [JsonProperty(Required = Required.Always, Order = 8, PropertyName="bilanzierungsmethode")] //[ProtoMember(8)] - public Bilanzierungsmethode bilanzierungsmethode; + public Bilanzierungsmethode Bilanzierungsmethode { get;set; } /// /// Die Preise gelten für Marktlokationen in der angegebenen Netzebene. /// - [JsonProperty(Required = Required.Always, Order = 9)] + [JsonProperty(Required = Required.Always, Order = 9, PropertyName= "netzebene")] //[ProtoMember(9)] - public Netzebene netzebene; + public Netzebene Netzebene { get;set; } /// /// Hier wird die Kundengruppe, für die der Preis gilt mit angegeben. /// - [JsonProperty(Required = Required.Always, Order = 10)] + [JsonProperty(Required = Required.Always, Order = 10, PropertyName="kundengruppe")] //[ProtoMember(10)] - public Kundengruppe kundengruppe; + public Kundengruppe Kundengruppe { get;set; } /// /// Der Netzbetreiber oder Messstellenbetreiber, der die Preise veröffentlicht hat. /// - [JsonProperty(Required = Required.Always, Order = 11)] + [JsonProperty(Required = Required.Always, Order = 11, PropertyName="herausgeber")] //[ProtoMember(11)] - public Marktteilnehmer herausgeber; + public Marktteilnehmer Herausgeber { get;set; } } } diff --git a/BO4E-dotnet/BO/PreisblattUmlagen.cs b/BO4E-dotnet/BO/PreisblattUmlagen.cs index 847c4650..d971fae0 100644 --- a/BO4E-dotnet/BO/PreisblattUmlagen.cs +++ b/BO4E-dotnet/BO/PreisblattUmlagen.cs @@ -1,6 +1,6 @@ using BO4E.ENUM; + using Newtonsoft.Json; -using ProtoBuf; namespace BO4E.BO { @@ -13,8 +13,8 @@ public class PreisblattUmlagen : Preisblatt /// /// Sparte, auf die sich die Umlage bezieht. /// - [JsonProperty(Required = Required.Always, Order = 7)] + [JsonProperty(Required = Required.Always, Order = 7, PropertyName = "sparte")] //[ProtoMember(7)] - public Sparte sparte; + public Sparte Sparte { get; set; } } } \ No newline at end of file diff --git a/BO4E-dotnet/BO/Rechnung.cs b/BO4E-dotnet/BO/Rechnung.cs index a93693cf..c5c8a9c7 100644 --- a/BO4E-dotnet/BO/Rechnung.cs +++ b/BO4E-dotnet/BO/Rechnung.cs @@ -1,11 +1,14 @@ using System; using System.Collections.Generic; using System.Globalization; + using BO4E.COM; using BO4E.ENUM; using BO4E.meta; + using Newtonsoft.Json; using Newtonsoft.Json.Linq; + using ProtoBuf; namespace BO4E.BO @@ -20,154 +23,154 @@ public class Rechnung : BusinessObject /// /// Bezeichnung für die vorliegende Rechnung. /// - [JsonProperty(Required = Required.Default, Order = 4)] + [JsonProperty(Required = Required.Default, Order = 4, PropertyName = "rechnungstitel")] [FieldName("billTitle", Language.EN)] [ProtoMember(4)] - public string rechnungstitel; + public string Rechnungstitel { get; set; } /// /// Status der Rechnung zur Kennzeichnung des Bearbeitungsstandes. Details siehe ENUM Rechnungsstatus /// - [JsonProperty(Required = Required.Default, Order = 5)] + [JsonProperty(Required = Required.Default, Order = 5, PropertyName = "rechnungsstatus")] [FieldName("billStatus", Language.EN)] [ProtoMember(5)] - public Rechnungsstatus? rechnungsstatus; + public Rechnungsstatus? Rechnungsstatus { get; set; } /// /// Kennzeichnung, ob es sich um eine Stornorechnung handelt. Im Falle "true" findet sich im Attribut "originalrechnungsnummer" die Nummer der Originalrechnung. /// - [JsonProperty(Required = Required.Always, Order = 6)] + [JsonProperty(Required = Required.Always, Order = 6, PropertyName = "storno")] [FieldName("isCancellation", Language.EN)] [ProtoMember(6)] - public bool storno; + public bool Storno { get; set; } /// /// Eine im Verwendungskontext eindeutige Nummer für die Rechnung. /// - [JsonProperty(Required = Required.Always, Order = 7)] + [JsonProperty(Required = Required.Always, Order = 7, PropertyName = "rechnungsnummer")] [ProtoMember(7)] [BoKey] [FieldName("billNumber", Language.EN)] - public string rechnungsnummer; + public string Rechnungsnummer { get; set; } /// /// Ausstellungsdatum der Rechnung. /// - [JsonProperty(Required = Required.Always, Order = 8)] + [JsonProperty(Required = Required.Always, Order = 8, PropertyName = "rechnungsdatum")] [ProtoMember(8)] [FieldName("billDate", Language.EN)] - public DateTime rechnungsdatum; + public DateTime Rechnungsdatum { get; set; } /// /// Zu diesem Datum ist die Zahlung fällig. /// - [JsonProperty(Required = Required.Always, Order = 9)] + [JsonProperty(Required = Required.Always, Order = 9, PropertyName = "faelligkeitsdatum")] [ProtoMember(9)] [FieldName("dueDate", Language.EN)] - public DateTime faelligkeitsdatum; + public DateTime Faelligkeitsdatum { get; set; } /// /// Ein kontextbezogender Rechnungstyp, z.B. Netznutzungsrechnung. Details siehe ENUM Rechnungstyp /// - [JsonProperty(Required = Required.Always, Order = 10)] + [JsonProperty(Required = Required.Always, Order = 10, PropertyName = "rechnungstyp")] [ProtoMember(10)] [FieldName("billType", Language.EN)] - public Rechnungstyp rechnungsstyp; + public Rechnungstyp Rechnungsstyp { get; set; } /// /// Im Falle einer Stornorechnung (storno = true) steht hier die Rechnungsnummer der stornierten Rechnung. /// - [JsonProperty(Required = Required.Default, Order = 11)] + [JsonProperty(Required = Required.Default, Order = 11, PropertyName = "originalRechnungsnummer")] [ProtoMember(11)] - public string originalRechnungsnummer; + public string OriginalRechnungsnummer { get; set; } /// /// Der Zeitraum der zugrunde liegenden Lieferung zur Rechnung. In der COM Zeitraum können diese angegeben werden. /// - [JsonProperty(Required = Required.Always, Order = 12)] + [JsonProperty(Required = Required.Always, Order = 12, PropertyName = "rechnungsperiode")] [ProtoMember(12)] [FieldName("billPeriod", Language.EN)] - public Zeitraum rechnungsperiode; + public Zeitraum Rechnungsperiode { get; set; } /// /// Der Aussteller der Rechnung. Details /// - [JsonProperty(Required = Required.Always, Order = 13)] + [JsonProperty(Required = Required.Always, Order = 13, PropertyName = "rechnungsersteller")] [ProtoMember(13)] [FieldName("issuer", Language.EN)] - public Geschaeftspartner rechnungsersteller; + public Geschaeftspartner Rechnungsersteller { get; set; } /// /// Der Empfänger der Rechnung. Details /// - [JsonProperty(Required = Required.Always, Order = 14)] + [JsonProperty(Required = Required.Always, Order = 14, PropertyName = "rechnungsempfaenger")] [ProtoMember(14)] [FieldName("recipient", Language.EN)] - public Geschaeftspartner rechnungsempfaenger; + public Geschaeftspartner Rechnungsempfaenger { get; set; } /// /// Die Summe der Nettobeträge der Rechnungsteile. Details /// - [JsonProperty(Required = Required.Always, Order = 15)] + [JsonProperty(Required = Required.Always, Order = 15, PropertyName = "gesamtnetto")] [ProtoMember(15)] [FieldName("totalNet", Language.EN)] - public Betrag gesamtnetto; + public Betrag Gesamtnetto { get; set; } /// /// Die Summe der Steuerbeträge der Rechnungsteile. Details /// - [JsonProperty(Required = Required.Always, Order = 16)] + [JsonProperty(Required = Required.Always, Order = 16, PropertyName = "gesamtsteuer")] [ProtoMember(16)] [FieldName("totalTax", Language.EN)] - public Betrag gesamtsteuer; + public Betrag Gesamtsteuer { get; set; } /// /// Die Summe aus Netto- und Steuerbetrag. Details /// - [JsonProperty(Required = Required.Always, Order = 17)] + [JsonProperty(Required = Required.Always, Order = 17, PropertyName = "gesamtbrutto")] [ProtoMember(17)] [FieldName("totalGross", Language.EN)] - public Betrag gesamtbrutto; + public Betrag Gesamtbrutto { get; set; } /// /// Die Summe evtl. vorausgezahlter Beträge, z.B. Abschläge. Angabe als Bruttowert. Details /// - [JsonProperty(Required = Required.Default, Order = 18)] + [JsonProperty(Required = Required.Default, Order = 18, PropertyName = "vorausgezahlt")] [ProtoMember(18)] [FieldName("prepaid", Language.EN)] - public Betrag vorausgezahlt; + public Betrag Vorausgezahlt { get; set; } /// /// Gesamtrabatt auf den Bruttobetrag. Details /// - [JsonProperty(Required = Required.Default, Order = 19)] + [JsonProperty(Required = Required.Default, Order = 19, PropertyName = "rabattBrutto")] [ProtoMember(19)] [FieldName("discountGross", Language.EN)] - public Betrag rabattBrutto; + public Betrag rabattBrutto { get; set; } /// - /// Der zu zahlende Betrag, der sich aus ( - - ) ergibt. Details + /// Der zu zahlende Betrag, der sich aus ( - - ) ergibt. Details /// /// - [JsonProperty(Required = Required.Always, Order = 20)] + [JsonProperty(Required = Required.Always, Order = 20, PropertyName = "zuzahlen")] [ProtoMember(20)] [FieldName("toPay", Language.EN)] - public Betrag zuzahlen; + public Betrag Zuzahlen { get; set; } /// /// Eine Liste mit Steuerbeträgen pro Steuerkennzeichen/Steuersatz. Die Summe dieser Beträge ergibt den Wert für gesamtsteuer. Details /// - [JsonProperty(Required = Required.Default, Order = 21)] + [JsonProperty(Required = Required.Default, Order = 21, PropertyName = "steuerbetraege")] [ProtoMember(21)] [FieldName("taxList", Language.EN)] - public List steuerbetraege; + public List Steuerbetraege { get; set; } /// /// Die Rechnungspositionen. Details siehe /// [ProtoMember(22)] - [JsonProperty(Required = Required.Always, Order = 22)] + [JsonProperty(Required = Required.Always, Order = 22, PropertyName = "rechnungspositionen")] [FieldName("invoiceItemList", Language.EN)] - public List rechnungspositionen; + public List Rechnungspositionen { get; set; } public Rechnung() { } @@ -189,15 +192,15 @@ public Rechnung(JObject sapPrintDocument) : this() throw new ArgumentException("The SAP print document did not contain a 'tErdz' token. Did you serialize using the right naming convention?"); } - rechnungsnummer = (infoToken["opbel"] ?? infoToken["OPBEL"]).Value(); - rechnungsdatum = TimeZoneInfo.ConvertTime((infoToken["bldat"] ?? infoToken["BLDAT"]).Value(), Verbrauch.CENTRAL_EUROPE_STANDARD_TIME, TimeZoneInfo.Utc); - rechnungsperiode = new Zeitraum() + Rechnungsnummer = (infoToken["opbel"] ?? infoToken["OPBEL"]).Value(); + Rechnungsdatum = TimeZoneInfo.ConvertTime((infoToken["bldat"] ?? infoToken["BLDAT"]).Value(), Verbrauch.CENTRAL_EUROPE_STANDARD_TIME, TimeZoneInfo.Utc); + Rechnungsperiode = new Zeitraum() { - startdatum = TimeZoneInfo.ConvertTime((tErdzToken[0]["ab"] ?? tErdzToken[0]["AB"]).Value(), Verbrauch.CENTRAL_EUROPE_STANDARD_TIME, TimeZoneInfo.Utc), - enddatum = TimeZoneInfo.ConvertTime((tErdzToken[0]["bis"] ?? tErdzToken[0]["BIS"]).Value(), Verbrauch.CENTRAL_EUROPE_STANDARD_TIME, TimeZoneInfo.Utc) + Startdatum = TimeZoneInfo.ConvertTime((tErdzToken[0]["ab"] ?? tErdzToken[0]["AB"]).Value(), Verbrauch.CENTRAL_EUROPE_STANDARD_TIME, TimeZoneInfo.Utc), + Enddatum = TimeZoneInfo.ConvertTime((tErdzToken[0]["bis"] ?? tErdzToken[0]["BIS"]).Value(), Verbrauch.CENTRAL_EUROPE_STANDARD_TIME, TimeZoneInfo.Utc) }; - faelligkeitsdatum = TimeZoneInfo.ConvertTime((infoToken["faedn"] ?? infoToken["FAEDN"]).Value(), Verbrauch.CENTRAL_EUROPE_STANDARD_TIME, TimeZoneInfo.Utc); - storno = false; + Faelligkeitsdatum = TimeZoneInfo.ConvertTime((infoToken["faedn"] ?? infoToken["FAEDN"]).Value(), Verbrauch.CENTRAL_EUROPE_STANDARD_TIME, TimeZoneInfo.Utc); + Storno = false; decimal gNetto, gSteure, gBrutto, vGezahlt, rBrutto, zZahlen; gNetto = gSteure = gBrutto = vGezahlt = rBrutto = zZahlen = 0.00M; @@ -207,7 +210,7 @@ public Rechnung(JObject sapPrintDocument) : this() List rpList = new List(); List stList = new List(); - vorausgezahlt = new Betrag() { waehrung = waehrungscode, wert = 0 }; + Vorausgezahlt = new Betrag() { Waehrung = waehrungscode, Wert = 0 }; foreach (JToken jrp in tErdzToken) { string belzart = (jrp["belzart"] ?? jrp["BELZART"]).ToString(); @@ -221,30 +224,30 @@ public Rechnung(JObject sapPrintDocument) : this() decimal zeitbezogeneMengeWert = 0; if (belzart == "000001") { - rp.positionstext = "ARBEITSPREIS"; + rp.Positionstext = "ARBEITSPREIS"; } else if (belzart == "000003") { - rp.positionstext = "PAUSCHALE"; + rp.Positionstext = "PAUSCHALE"; mengeneinheit = Mengeneinheit.JAHR; zeitbezogeneMengeWert = (jrp["preisbtr"] ?? jrp["PREISBTR"]).Value(); - rp.zeitbezogeneMenge = new Menge() { einheit = Mengeneinheit.TAG, wert = zeitbezogeneMengeWert }; + rp.ZeitbezogeneMenge = new Menge() { Einheit = Mengeneinheit.TAG, Wert = zeitbezogeneMengeWert }; - rp.einzelpreis = new Preis() + rp.Einzelpreis = new Preis() { - wert = decimal.Parse((jrp["zeitant"] ?? jrp["ZEITANT"]).ToString()), - einheit = waehrungseinheit, - bezugswert = mengeneinheit + Wert = decimal.Parse((jrp["zeitant"] ?? jrp["ZEITANT"]).ToString()), + Einheit = waehrungseinheit, + Bezugswert = mengeneinheit }; } else if (belzart == "000004") - rp.positionstext = "VERRECHNUNGSPREIS"; + rp.Positionstext = "VERRECHNUNGSPREIS"; else if (belzart == "SUBT") - rp.positionstext = "zuzüglich Mehrwertsteuer 19,000%"; + rp.Positionstext = "zuzüglich Mehrwertsteuer 19,000%"; else if (belzart == "ZHFBP1" || belzart == "CITAX") - rp.positionstext = belzart; + rp.Positionstext = belzart; else - rp.positionstext = ""; + rp.Positionstext = ""; if ((jrp["massbill"] ?? jrp["MASSBILL"]) != null && !string.IsNullOrWhiteSpace((jrp["massbill"] ?? jrp["MASSBILL"]).Value())) { @@ -255,7 +258,7 @@ public Rechnung(JObject sapPrintDocument) : this() if ((jrp["timbasis"] ?? jrp["TIMBASIS"]).Value() == "365") { mengeneinheit = Mengeneinheit.JAHR; - rp.zeitbezogeneMenge = new Menge() { einheit = Mengeneinheit.TAG, wert = zeitbezogeneMengeWert }; + rp.ZeitbezogeneMenge = new Menge() { Einheit = Mengeneinheit.TAG, Wert = zeitbezogeneMengeWert }; } } else @@ -263,47 +266,47 @@ public Rechnung(JObject sapPrintDocument) : this() mengeneinheit = Mengeneinheit.KWH; } - if (rp.einzelpreis == null) + if (rp.Einzelpreis == null) { if ((jrp["preisbtr"] ?? jrp["PREISBTR"]) != null) { - rp.einzelpreis = new Preis() + rp.Einzelpreis = new Preis() { - wert = decimal.Parse((jrp["preisbtr"] ?? jrp["PREISBTR"]).ToString()), - einheit = waehrungseinheit, - bezugswert = mengeneinheit + Wert = decimal.Parse((jrp["preisbtr"] ?? jrp["PREISBTR"]).ToString()), + Einheit = waehrungseinheit, + Bezugswert = mengeneinheit }; } else - rp.einzelpreis = new Preis() + rp.Einzelpreis = new Preis() { - wert = 0, - einheit = waehrungseinheit, - bezugswert = mengeneinheit + Wert = 0, + Einheit = waehrungseinheit, + Bezugswert = mengeneinheit }; } - rp.positionsnummer = (jrp["belzeile"] ?? jrp["BELZEILE"]).Value(); + rp.Positionsnummer = (jrp["belzeile"] ?? jrp["BELZEILE"]).Value(); if ((jrp["bis"] ?? jrp["BIS"]) != null && (jrp["bis"] ?? jrp["BIS"]).Value() != "0000-00-00") { - rp.lieferungBis = TimeZoneInfo.ConvertTime((jrp["bis"] ?? jrp["BIS"]).Value(), Verbrauch.CENTRAL_EUROPE_STANDARD_TIME, TimeZoneInfo.Utc); + rp.LieferungBis = TimeZoneInfo.ConvertTime((jrp["bis"] ?? jrp["BIS"]).Value(), Verbrauch.CENTRAL_EUROPE_STANDARD_TIME, TimeZoneInfo.Utc); } if ((jrp["ab"] ?? jrp["AB"]) != null && (jrp["ab"] ?? jrp["AB"]).Value() != "0000-00-00") { - rp.lieferungVon = TimeZoneInfo.ConvertTime((jrp["ab"] ?? jrp["AB"]).Value(), Verbrauch.CENTRAL_EUROPE_STANDARD_TIME, TimeZoneInfo.Utc); + rp.LieferungVon = TimeZoneInfo.ConvertTime((jrp["ab"] ?? jrp["AB"]).Value(), Verbrauch.CENTRAL_EUROPE_STANDARD_TIME, TimeZoneInfo.Utc); } if ((jrp["vertrag"] ?? jrp["VERTRAG"]) != null) { - rp.vertragskontoId = (jrp["vertrag"] ?? jrp["VERTRAG"]).Value(); + rp.VertragskontoId = (jrp["vertrag"] ?? jrp["VERTRAG"]).Value(); } if ((jrp["iAbrmenge"] ?? jrp["I_ABRMENGE"]) != null) { - rp.positionsMenge = new Menge() + rp.PositionsMenge = new Menge() { - wert = (jrp["iAbrmenge"] ?? jrp["I_ABRMENGE"]).Value(), - einheit = mengeneinheit + Wert = (jrp["iAbrmenge"] ?? jrp["I_ABRMENGE"]).Value(), + Einheit = mengeneinheit }; } @@ -311,24 +314,24 @@ public Rechnung(JObject sapPrintDocument) : this() { if (belzart != "SUBT" && belzart != "CITAX") { - rp.teilsummeNetto = new Betrag() + rp.TeilsummeNetto = new Betrag() { - wert = (jrp["nettobtr"] ?? jrp["NETTOBTR"]).Value(), - waehrung = waehrungscode + Wert = (jrp["nettobtr"] ?? jrp["NETTOBTR"]).Value(), + Waehrung = waehrungscode }; } else { - rp.teilsummeNetto = new Betrag() + rp.TeilsummeNetto = new Betrag() { - wert = (jrp["sbasw"] ?? jrp["SBASW"]).Value(), - waehrung = waehrungscode + Wert = (jrp["sbasw"] ?? jrp["SBASW"]).Value(), + Waehrung = waehrungscode }; Steuerbetrag steuerbetrag = new Steuerbetrag() { - basiswert = (jrp["sbasw"] ?? jrp["SBASW"]).Value(), - steuerwert = (jrp["sbetw"] ?? jrp["SBETW"]).Value(), - waehrung = (Waehrungscode)Enum.Parse(typeof(Waehrungscode), (jrp["twaers"] ?? jrp["TWAERS"]).Value()) + Basiswert = (jrp["sbasw"] ?? jrp["SBASW"]).Value(), + Steuerwert = (jrp["sbetw"] ?? jrp["SBETW"]).Value(), + Waehrung = (Waehrungscode)Enum.Parse(typeof(Waehrungscode), (jrp["twaers"] ?? jrp["TWAERS"]).Value()) }; decimal steuerProzent; if ((jrp["stprz"] ?? jrp["STPRZ"]) != null && !string.IsNullOrWhiteSpace((jrp["stprz"] ?? jrp["STPRZ"]).Value())) @@ -337,29 +340,29 @@ public Rechnung(JObject sapPrintDocument) : this() } else { - steuerProzent = steuerbetrag.steuerwert / steuerbetrag.basiswert * 100.0M; + steuerProzent = steuerbetrag.Steuerwert / steuerbetrag.Basiswert * 100.0M; } if ((int)steuerProzent == 19) { - steuerbetrag.steuerkennzeichen = Steuerkennzeichen.UST_19; + steuerbetrag.Steuerkennzeichen = Steuerkennzeichen.UST_19; } else if ((int)steuerProzent == 7) { - steuerbetrag.steuerkennzeichen = Steuerkennzeichen.UST_7; + steuerbetrag.Steuerkennzeichen = Steuerkennzeichen.UST_7; } else { throw new NotImplementedException($"Taxrate Internal '{jrp["taxrateInternal"]}' is not mapped."); } - rp.teilsummeSteuer = steuerbetrag; + rp.TeilsummeSteuer = steuerbetrag; } if ((jrp["nettobtr"] ?? jrp["NETTOBTR"]).Value() <= 0) { - vorausgezahlt = new Betrag() { waehrung = waehrungscode, wert = (jrp["nettobtr"] ?? jrp["NETTOBTR"]).Value() }; + Vorausgezahlt = new Betrag() { Waehrung = waehrungscode, Wert = (jrp["nettobtr"] ?? jrp["NETTOBTR"]).Value() }; } } - rp.zeiteinheit = mengeneinheit; + rp.Zeiteinheit = mengeneinheit; rpList.Add(rp); var be = (jrp["nettobtr"] ?? jrp["NETTOBTR"]); @@ -373,9 +376,9 @@ public Rechnung(JObject sapPrintDocument) : this() { Steuerbetrag steuerbetrag = new Steuerbetrag() { - basiswert = (jrp["sbasw"] ?? jrp["SBASW"]).Value(), - steuerwert = (jrp["sbetw"] ?? jrp["SBETW"]).Value(), - waehrung = (Waehrungscode)Enum.Parse(typeof(Waehrungscode), (jrp["twaers"] ?? jrp["TWAERS"]).Value()) + Basiswert = (jrp["sbasw"] ?? jrp["SBASW"]).Value(), + Steuerwert = (jrp["sbetw"] ?? jrp["SBETW"]).Value(), + Waehrung = (Waehrungscode)Enum.Parse(typeof(Waehrungscode), (jrp["twaers"] ?? jrp["TWAERS"]).Value()) }; decimal steuerProzent; if ((jrp["stprz"] ?? jrp["STPRZ"]) != null && !string.IsNullOrWhiteSpace((jrp["stprz"] ?? jrp["STPRZ"]).Value())) @@ -384,15 +387,15 @@ public Rechnung(JObject sapPrintDocument) : this() } else { - steuerProzent = Math.Round(steuerbetrag.steuerwert / steuerbetrag.basiswert * 100.0M); + steuerProzent = Math.Round(steuerbetrag.Steuerwert / steuerbetrag.Basiswert * 100.0M); } if (steuerProzent == 19.0M) { - steuerbetrag.steuerkennzeichen = Steuerkennzeichen.UST_19; + steuerbetrag.Steuerkennzeichen = Steuerkennzeichen.UST_19; } else if (steuerProzent == 7.0M) { - steuerbetrag.steuerkennzeichen = Steuerkennzeichen.UST_7; + steuerbetrag.Steuerkennzeichen = Steuerkennzeichen.UST_7; } else { @@ -404,44 +407,44 @@ public Rechnung(JObject sapPrintDocument) : this() } } } - steuerbetraege = stList; - rechnungspositionen = rpList; + Steuerbetraege = stList; + Rechnungspositionen = rpList; gBrutto = gNetto + gSteure; zZahlen = gBrutto - vGezahlt - rBrutto; - gesamtnetto = new Betrag() { wert = gNetto, waehrung = waehrungscode }; - gesamtsteuer = new Betrag() { wert = gSteure, waehrung = waehrungscode }; - gesamtbrutto = new Betrag() { wert = gBrutto, waehrung = waehrungscode }; - zuzahlen = new Betrag() { wert = zZahlen, waehrung = waehrungscode }; + Gesamtnetto = new Betrag() { Wert = gNetto, Waehrung = waehrungscode }; + Gesamtsteuer = new Betrag() { Wert = gSteure, Waehrung = waehrungscode }; + Gesamtbrutto = new Betrag() { Wert = gBrutto, Waehrung = waehrungscode }; + Zuzahlen = new Betrag() { Wert = zZahlen, Waehrung = waehrungscode }; - rechnungsersteller = new Geschaeftspartner() + Rechnungsersteller = new Geschaeftspartner() { - geschaeftspartnerrolle = new List() { Geschaeftspartnerrolle.LIEFERANT }, - gewerbekennzeichnung = true, - anrede = Anrede.HERR, - name1 = "Mein super Lieferant", - partneradresse = new Adresse() + Geschaeftspartnerrolle = new List() { Geschaeftspartnerrolle.LIEFERANT }, + Gewerbekennzeichnung = true, + Anrede = Anrede.HERR, + Name1 = "Mein super Lieferant", + Partneradresse = new Adresse() { - strasse = "Max-Plank-Strasse", - hausnummer = "8", - postleitzahl = "90190", - landescode = Landescode.DE, - ort = "Walldorf" + Strasse = "Max-Plank-Strasse", + Hausnummer = "8", + Postleitzahl = "90190", + Landescode = Landescode.DE, + Ort = "Walldorf" } }; - rechnungsempfaenger = new Geschaeftspartner() + Rechnungsempfaenger = new Geschaeftspartner() { - geschaeftspartnerrolle = new List() { Geschaeftspartnerrolle.KUNDE }, - gewerbekennzeichnung = false, - anrede = Anrede.HERR, - name1 = "Lustig", - name2 = "Peter", - partneradresse = new Adresse() + Geschaeftspartnerrolle = new List() { Geschaeftspartnerrolle.KUNDE }, + Gewerbekennzeichnung = false, + Anrede = Anrede.HERR, + Name1 = "Lustig", + Name2 = "Peter", + Partneradresse = new Adresse() { - strasse = "Magnusstraße", - hausnummer = "20", - postleitzahl = "50672", - landescode = Landescode.DE, - ort = "Köln" + Strasse = "Magnusstraße", + Hausnummer = "20", + Postleitzahl = "50672", + Landescode = Landescode.DE, + Ort = "Köln" } }; } diff --git a/BO4E-dotnet/BO/Region.cs b/BO4E-dotnet/BO/Region.cs index 754e0234..ed78b1e2 100644 --- a/BO4E-dotnet/BO/Region.cs +++ b/BO4E-dotnet/BO/Region.cs @@ -1,7 +1,10 @@ using System.Collections.Generic; + using BO4E.COM; using BO4E.meta; + using Newtonsoft.Json; + using ProtoBuf; namespace BO4E.BO @@ -15,23 +18,23 @@ public class Region : BusinessObject /// /// Bezeichnung der Region. /// - [JsonProperty(Required = Required.Always, Order = 4)] + [JsonProperty(Required = Required.Always, Order = 4, PropertyName = "bezeichnung")] [ProtoMember(4)] [BoKey] - public string bezeichnung; + public string Bezeichnung { get; set; } /// /// Positivliste der Kriterien zur Definition der Region. /// - [JsonProperty(Required = Required.Always, Order = 5)] + [JsonProperty(Required = Required.Always, Order = 5, PropertyName = "positivListe")] [ProtoMember(5)] - public List positivListe; + public List PositivListe { get; set; } /// /// Negativliste der Kriterien zur Definition der Region. /// - [JsonProperty(Required = Required.Default, Order = 6)] + [JsonProperty(Required = Required.Default, Order = 6, PropertyName = "negativListe")] [ProtoMember(6)] - public List negativListe; + public List NegativListe { get; set; } } } diff --git a/BO4E-dotnet/BO/Vertrag.cs b/BO4E-dotnet/BO/Vertrag.cs index 32b8885b..fffb4283 100644 --- a/BO4E-dotnet/BO/Vertrag.cs +++ b/BO4E-dotnet/BO/Vertrag.cs @@ -1,12 +1,14 @@ using System; using System.Collections.Generic; -using System.Linq; using System.Runtime.Serialization; + using BO4E.COM; using BO4E.ENUM; using BO4E.meta; + using Newtonsoft.Json; using Newtonsoft.Json.Linq; + using ProtoBuf; namespace BO4E.BO @@ -22,110 +24,110 @@ public class Vertrag : BusinessObject /// Eine im Verwendungskontext eindeutige Nummer für den Vertrag /// [BoKey] - [JsonProperty(Required = Required.Always, Order = 4)] + [JsonProperty(Required = Required.Always, Order = 4, PropertyName = "vertragsnummer")] [ProtoMember(4)] - public string vertragsnummer; + public string Vertragsnummer { get; set; } /// /// Beschreibung zum Vertrag /// - [JsonProperty(Required = Required.Default, Order = 5)] + [JsonProperty(Required = Required.Default, Order = 5, PropertyName = "beschreibung")] [ProtoMember(5)] - public string beschreibung; + public string Beschreibung { get; set; } /// /// Hier ist festgelegt, um welche Art von Vertrag es sich handelt. Z.B. Netznutzungvertrag. Details siehe ENUM Vertragsart /// - [JsonProperty(Required = Required.Always, Order = 6)] + [JsonProperty(Required = Required.Always, Order = 6, PropertyName = "vertragsart")] [ProtoMember(6)] - public Vertragsart vertragsart; + public Vertragsart Vertragsart { get; set; } /// /// Gibt den Status des Vertrags an. Siehe ENUM Vertragsstatus /// - [JsonProperty(Required = Required.Always, Order = 7)] + [JsonProperty(Required = Required.Always, Order = 7, PropertyName = "vertragstatus")] [ProtoMember(7)] - public Vertragstatus vertragstatus; + public Vertragstatus Vertragstatus { get; set; } // ToDo: shouldn't this be vertragsstatus with "ss"? /// /// Unterscheidungsmöglichkeiten für die Sparte. Siehe ENUM Sparte /// - [JsonProperty(Required = Required.Always, Order = 8)] + [JsonProperty(Required = Required.Always, Order = 8, PropertyName = "sparte")] [ProtoMember(8)] - public Sparte sparte; + public Sparte Sparte { get; set; } /// /// Gibt an, wann der Vertrag beginnt. /// - [JsonProperty(Required = Required.Always, Order = 9)] + [JsonProperty(Required = Required.Always, Order = 9, PropertyName = "vertragsbeginn")] [ProtoMember(9)] - public DateTime vertragsbeginn; + public DateTime Vertragsbeginn { get; set; } /// /// Gibt an, wann der Vertrag (voraussichtlich) endet oder beendet wurde. /// - [JsonProperty(Required = Required.Always, Order = 10)] + [JsonProperty(Required = Required.Always, Order = 10, PropertyName = "vertragsende")] [ProtoMember(10)] - public DateTime vertragsende; + public DateTime Vertragsende { get; set; } /// /// Der "erstgenannte" Vertragspartner. In der Regel der Aussteller des Vertrags. Beispiel: "Vertrag zwischen Vertagspartner 1 ..." Siehe BO Geschaeftspartner /// - [JsonProperty(Required = Required.Default, Order = 11)] // TODO: should be required but our CDS is missing the association + [JsonProperty(Required = Required.Default, Order = 11, PropertyName = "vertragspartner1")] // TODO: should be required but our CDS is missing the association [ProtoMember(11)] - public Geschaeftspartner vertragspartner1; + public Geschaeftspartner Vertragspartner1 { get; set; } /// /// Der "zweitgenannte" Vertragspartner. In der Regel der Empfänger des Vertrags. Beispiel "Vertrag zwischen Vertagspartner 1 und Vertragspartner 2". Siehe BO Geschaeftspartner /// - [JsonProperty(Required = Required.Default, Order = 12)] // TODO: should be required but our CDS is missing the association + [JsonProperty(Required = Required.Default, Order = 12, PropertyName = "vertragspartner2")] // TODO: should be required but our CDS is missing the association [ProtoMember(12)] - public Geschaeftspartner vertragspartner2; + public Geschaeftspartner Vertragspartner2 { get; set; } /// /// Unterzeichner des Vertragspartners1. Siehe COM Unterschrift /// - [JsonProperty(Required = Required.Default, Order = 13)] + [JsonProperty(Required = Required.Default, Order = 13, PropertyName = "unterzeichnervp1")] [ProtoMember(13)] - public List unterzeichnervp1; + public List Unterzeichnervp1 { get; set; } /// /// Unterzeichner des Vertragspartners2. Siehe COM Unterschrift /// - [JsonProperty(Required = Required.Default, Order = 14)] + [JsonProperty(Required = Required.Default, Order = 14, PropertyName = "unterzeichnervp2")] [ProtoMember(14)] - public List unterzeichnervp2; + public List Unterzeichnervp2 { get; set; } /// /// Festlegungen zu Laufzeiten und Kündigungsfristen. Details siehe COM Vertragskonditionen /// - [JsonProperty(Required = Required.Default, Order = 15)] + [JsonProperty(Required = Required.Default, Order = 15, PropertyName = "vertragskonditionen")] [ProtoMember(15)] - public Vertragskonditionen vertragskonditionen; + public Vertragskonditionen Vertragskonditionen { get; set; } /// /// Der Vertragsteil wird dazu verwendet, eine vertragliche Leistung in Bezug zu einer Lokation (Markt- oder Messlokation) festzulegen. Details siehe COM Vertragsteil /// - [JsonProperty(Required = Required.Default, Order = 16)] // TODO: should be required but our CDS is missing the association + [JsonProperty(Required = Required.Default, Order = 16, PropertyName = "vertragsteile")] // TODO: should be required always but our CDS is missing the association [ProtoMember(16)] - public List vertragsteile; + public List Vertragsteile { get; set; } /// /// gemeinderabatt für EDIFACT mapping. /// // ToDo: What is the unit? is 1.0 = 100% discount? - [JsonProperty(Required = Required.Default, Order = 17)] + [JsonProperty(Required = Required.Default, Order = 17, PropertyName = "gemeinderabatt")] [NonOfficial(NonOfficialCategory.CUSTOMER_REQUIREMENTS)] [ProtoMember(1017)] - public decimal? gemeinderabatt; + public decimal? Gemeinderabatt { get; set; } /// /// korrespondenzpartner für EDIFACT mapping /// - [JsonProperty(Required = Required.Default, Order = 18)] + [JsonProperty(Required = Required.Default, Order = 18, PropertyName = "korrespondenzpartner")] [NonOfficial(NonOfficialCategory.CUSTOMER_REQUIREMENTS)] [ProtoMember(1018)] // ToDO: isn't an Ansprechpartner the better choice than a Geschaeftspartner? - public Geschaeftspartner korrespondenzpartner; + public Geschaeftspartner Korrespondenzpartner { get; set; } /// @@ -135,15 +137,15 @@ public class Vertrag : BusinessObject [OnDeserialized] protected void OnDeserialized(StreamingContext context) { - if ((vertragsteile == null || vertragsteile.Count == 0) && userProperties.ContainsKey("lokationsId")) + if ((Vertragsteile == null || Vertragsteile.Count == 0) && (UserProperties != null && UserProperties.ContainsKey("lokationsId"))) { - vertragsteile = new List() + Vertragsteile = new List() { new Vertragsteil() { - vertragsteilbeginn = this.vertragsbeginn, - vertragsteilende = this.vertragsende, - lokation = userProperties["lokationsId"].Value() + Vertragsteilbeginn = this.Vertragsbeginn, + Vertragsteilende = this.Vertragsende, + Lokation = UserProperties["lokationsId"].Value() } }; } diff --git a/BO4E-dotnet/BO/Zaehler.cs b/BO4E-dotnet/BO/Zaehler.cs index d0b38a5e..ee5628a9 100644 --- a/BO4E-dotnet/BO/Zaehler.cs +++ b/BO4E-dotnet/BO/Zaehler.cs @@ -1,10 +1,13 @@ using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; + using BO4E.COM; using BO4E.ENUM; using BO4E.meta; + using Newtonsoft.Json; + using ProtoBuf; namespace BO4E.BO @@ -17,82 +20,82 @@ public class Zaehler : BusinessObject { /// Nummerierung des Zählers, vergeben durch den Messstellenbetreiber [BoKey] - [JsonProperty(Required = Required.Always, Order = 4)] + [JsonProperty(Required = Required.Always, Order = 4, PropertyName = "zaehlernummer")] [ProtoMember(4)] - public string zaehlernummer; + public string Zaehlernummer { get; set; } - /// Strom oder Gas. - [JsonProperty(Required = Required.Always, Order = 5)] + /// Strom oder Gas. + [JsonProperty(Required = Required.Always, Order = 5, PropertyName = "sparte")] [ProtoMember(5)] - public Sparte sparte; + public Sparte Sparte { get; set; } /// Spezifikation die Richtung des Zählers betreffend. - /// - [JsonProperty(Required = Required.Always, Order = 6)] + /// + [JsonProperty(Required = Required.Always, Order = 6, PropertyName = "zaehlerauspraegung")] [ProtoMember(6)] - public Zaehlerauspraegung zaehlerauspraegung; + public Zaehlerauspraegung Zaehlerauspraegung { get; set; } /// Typisierung des Zählers - /// - [JsonProperty(Required = Required.Always, Order = 7)] + /// + [JsonProperty(Required = Required.Always, Order = 7, PropertyName = "zaehlertyp")] [ProtoMember(7)] - public Zaehlertyp zaehlertyp; + public Zaehlertyp Zaehlertyp { get; set; } /// Spezifikation bezüglich unterstützter Tarifarten. - /// - [JsonProperty(Required = Required.Always, Order = 8)] + /// + [JsonProperty(Required = Required.Always, Order = 8, PropertyName = "tarifart")] [ProtoMember(8)] - public Tarifart tarifart; + public Tarifart Tarifart { get; set; } /// Zählerkonstante auf dem Zähler. - [JsonProperty(Required = Required.Default, Order = 9)] + [JsonProperty(Required = Required.Default, Order = 9, PropertyName = "zaehlerkonstante")] [ProtoMember(9)] - public Decimal zaehlerkonstante; + public Decimal zaehlerkonstante { get; set; } /// Bis zu diesem Datum ist der Zähler geeicht. - [JsonProperty(Required = Required.Default, Order = 10)] + [JsonProperty(Required = Required.Default, Order = 10, PropertyName = "eichungBis")] [ProtoMember(10)] - public DateTime? eichungBis; // ToDO implement date + public DateTime? EichungBis { get; set; } // ToDO implement date /// Zu diesem Datum fand die letzte Eichprüfung des Zählers statt. - [JsonProperty(Required = Required.Default, Order = 11)] + [JsonProperty(Required = Required.Default, Order = 11, PropertyName = "letzteEichung")] [ProtoMember(11)] - public DateTime? letzteEichung; + public DateTime? LetzteEichung { get; set; } /// Die Zählwerke des Zählers. /// - [JsonProperty(Required = Required.Always, Order = 12)] + [JsonProperty(Required = Required.Always, Order = 12, PropertyName = "zaehlwerke")] [MinLength(1)] [ProtoMember(12)] - public List zaehlwerke; + public List Zaehlwerke { get; set; } /// Der Hersteller des Zählers. Details - [JsonProperty(Required = Required.Default, Order = 13)] + [JsonProperty(Required = Required.Default, Order = 13, NullValueHandling = NullValueHandling.Ignore, PropertyName = "zaehlerhersteller")] [ProtoMember(13)] - public Geschaeftspartner zaehlerhersteller; + public Geschaeftspartner Zaehlerhersteller { get; set; } /// /// Referenz auf das Smartmeter-Gateway /// - [JsonProperty(Required = Required.Default, Order = 14)] + [JsonProperty(Required = Required.Default, Order = 14, PropertyName = "gateway")] [NonOfficial(NonOfficialCategory.CUSTOMER_REQUIREMENTS)] [ProtoMember(1014)] - public string gateway; + public string Gateway { get; set; } /// /// Fernschaltung /// - [JsonProperty(Required = Required.Default, Order = 15)] + [JsonProperty(Required = Required.Default, Order = 15, PropertyName = "fernschaltung")] [ProtoMember(1015)] [NonOfficial(NonOfficialCategory.CUSTOMER_REQUIREMENTS)] - public Fernschaltung? fernschaltung; + public Fernschaltung? Fernschaltung { get; set; } /// /// Messwerterfassung am Zählpunkt /// - [JsonProperty(Required = Required.Default, Order = 16)] + [JsonProperty(Required = Required.Default, Order = 16, PropertyName = "messwerterfassung")] [ProtoMember(1016)] [NonOfficial(NonOfficialCategory.CUSTOMER_REQUIREMENTS)] - public Messwerterfassung? messwerterfassung; + public Messwerterfassung? Messwerterfassung { get; set; } } } diff --git a/BO4E-dotnet/BO4E-dotnet.csproj b/BO4E-dotnet/BO4E-dotnet.csproj index 669801f1..8cd3644e 100644 --- a/BO4E-dotnet/BO4E-dotnet.csproj +++ b/BO4E-dotnet/BO4E-dotnet.csproj @@ -8,7 +8,7 @@ Hochfrequenz Untenehmensberatung GmbH BO4E .net core bindings https://github.com/HFInnovation/BO4E-dotnet/ - 0.1.9 + 0.2.1 $(VersionSuffix) BO4Enet false @@ -37,8 +37,11 @@ + + + True @@ -47,12 +50,64 @@ + + + + + + + + + + + + + Always + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + @@ -61,7 +116,7 @@ - + diff --git a/BO4E-dotnet/BoEdiMapper.cs b/BO4E-dotnet/BoEdiMapper.cs index 1fff586b..18093974 100644 --- a/BO4E-dotnet/BoEdiMapper.cs +++ b/BO4E-dotnet/BoEdiMapper.cs @@ -55,17 +55,16 @@ public static string ToEdi(string objectName, string objectValue) StaticLogger.Logger = new Microsoft.Extensions.Logging.Debug.DebugLogger("Testlogger", (log, level) => { return true; }); _logger = StaticLogger.Logger; } - Type[] types = Assembly.GetExecutingAssembly().GetTypes(); + //Type[] types = Assembly.GetExecutingAssembly().GetTypes(); Type clazz = Assembly.GetExecutingAssembly().GetType(namespacePrefix + "." + objectName); Type ediClazz = Assembly.GetExecutingAssembly().GetType($"{namespacePrefix}.EDI.{objectName}Edi"); - FieldInfo field = null; - field = clazz.GetField(objectValue); - if (field == null) + var prop = clazz.GetField(objectValue); + if (prop == null) { _logger.LogWarning($"Class objectName has no field {objectValue}; Might already be the edi value..."); - var alternativeField = EdiBoMapper.fromEdi(objectName, objectValue); - if (alternativeField != null && clazz.GetField(alternativeField) != null) + var alternativField = EdiBoMapper.fromEdi(objectName, objectValue); + if (alternativField != null && clazz.GetField(alternativField) != null) { return objectValue; } @@ -81,21 +80,19 @@ public static string ToEdi(string objectName, string objectValue) return objectValue; } // try to find annotation with EdiValue - FieldInfo[] annotatedEdiFields = Assembly.GetExecutingAssembly().GetTypes().Where(t => t.Name == ediClazz.Name).SelectMany(t => t.GetFields()).Where(f => f.GetCustomAttributes(typeof(MappingAttribute), false).Length > 0).ToArray(); + var annotatedEdiFields = Assembly.GetExecutingAssembly().GetTypes() + .Where(t => t.Name == ediClazz.Name) + .SelectMany(t => t.GetFields()) + .Where(f => f.GetCustomAttributes(typeof(MappingAttribute), false).Length > 0).ToArray(); if (annotatedEdiFields.Length == 0) { _logger.LogError($"No annotated EdiFields found for {objectName} / {objectValue}"); return null; } - foreach (FieldInfo aef in annotatedEdiFields) + foreach (var aef in annotatedEdiFields) { - foreach (Attribute a in aef.GetCustomAttributes()) + foreach (MappingAttribute ma in aef.GetCustomAttributes()) { - if (a.GetType() != typeof(MappingAttribute)) - { - continue; - } - MappingAttribute ma = (MappingAttribute)a; var matchCandidate = ma.Mapping.FirstOrDefault(); if (matchCandidate != null && matchCandidate.ToString() == objectValue) { @@ -133,26 +130,14 @@ public static JObject ReplaceWithEdiValues(Object o) } string boString = JsonConvert.SerializeObject(o, new StringEnumConverter()); JObject result = (JObject)JsonConvert.DeserializeObject(boString); - foreach (FieldInfo oField in o.GetType().GetFields()) + foreach (var oProp in o.GetType().GetProperties().Where(p=>p.GetValue(o)!=null)) { - if (oField.GetValue(o) == null) - { - continue; - } - Type originalType; - Type underlyingType = Nullable.GetUnderlyingType(oField.FieldType); - if (underlyingType == null) - { - originalType = oField.FieldType; - } - else - { - originalType = underlyingType; - } + string serializationName = oProp.GetCustomAttribute().PropertyName ?? oProp.Name; + Type originalType = Nullable.GetUnderlyingType(oProp.PropertyType) ?? oProp.PropertyType; if (originalType.IsSubclassOf(typeof(BO4E.COM.COM)) || originalType.IsSubclassOf(typeof(BO4E.BO.BusinessObject))) { - object newValue = ReplaceWithEdiValues(oField.GetValue(o)); - result[oField.Name] = (JToken)newValue; + object newValue = ReplaceWithEdiValues(oProp.GetValue(o)); + result[serializationName] = (JToken)newValue; } else if (originalType.IsGenericType && (originalType.GetGenericTypeDefinition() == typeof(List<>))) { @@ -165,14 +150,14 @@ public static JObject ReplaceWithEdiValues(Object o) Type listType = typeof(List<>).MakeGenericType(listItemEdiType); object newList = Activator.CreateInstance(listType); MethodInfo miAdd = listType.GetMethod("Add"); - foreach (object listItem in (IEnumerable)oField.GetValue(o)) + foreach (object listItem in (IEnumerable)oProp.GetValue(o)) { string newValue = ToEdi(originalListItemType.Name, listItem.ToString()); miAdd.Invoke(newList, new object[] { Enum.Parse(listItemEdiType, newValue) }); } JsonSerializer js = new JsonSerializer(); js.Converters.Add(new StringEnumConverter()); - result[oField.Name] = JToken.FromObject(newList, js); + result[serializationName] = JToken.FromObject(newList, js); } else { @@ -184,19 +169,19 @@ public static JObject ReplaceWithEdiValues(Object o) Type listType = typeof(List<>).MakeGenericType(typeof(JObject)); object newList = Activator.CreateInstance(listType); MethodInfo miAdd = listType.GetMethod("Add"); - foreach (object listItem in (IEnumerable)oField.GetValue(o)) + foreach (object listItem in (IEnumerable)oProp.GetValue(o)) { object newListItem = ReplaceWithEdiValues(listItem); miAdd.Invoke(newList, new object[] { newListItem }); } - result[oField.Name] = JToken.FromObject(newList); + result[serializationName] = JToken.FromObject(newList); } } Type ediType = Assembly.GetExecutingAssembly().GetType($"{namespacePrefix}.EDI.{originalType.Name}Edi"); if (ediType != null) { - string newValue = ToEdi(originalType.Name, oField.GetValue(o).ToString()); - result[oField.Name] = newValue; + string newValue = ToEdi(originalType.Name, oProp.GetValue(o).ToString()); + result[serializationName] = newValue; } } return result; diff --git a/BO4E-dotnet/BoMapper.cs b/BO4E-dotnet/BoMapper.cs index bc6c633d..c8ed3402 100644 --- a/BO4E-dotnet/BoMapper.cs +++ b/BO4E-dotnet/BoMapper.cs @@ -1,17 +1,17 @@ using System; -using System.Collections; using System.Collections.Generic; -using System.Globalization; using System.Linq; using System.Reflection; using System.Text.RegularExpressions; + using BO4E.BO; using BO4E.meta; +using BO4E.meta.LenientConverters; + using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Newtonsoft.Json.Schema; -using Newtonsoft.Json.Serialization; - + namespace BO4E { /// @@ -114,6 +114,7 @@ public static BusinessObject MapObject(string businessObjectName, JObject jobjec /// a BO4E business object () of the type provided in businessObjectName /// /// + [Obsolete("DEPRECATED! Please use the overloaded method MapObject(...) or MapObject(Type t,...) that accept types, not strings.")] public static BusinessObject MapObject(Type businessObjectType, JObject jobject, HashSet userPropertiesWhiteList, LenientParsing lenient = LenientParsing.Strict) { if (!businessObjectType.IsSubclassOf(typeof(BusinessObject))) @@ -128,52 +129,7 @@ public static BusinessObject MapObject(Type businessObjectType, JObject jobject, } else { - List converters = new List(); - foreach (LenientParsing lp in Enum.GetValues(typeof(LenientParsing))) - { - if (lenient.HasFlag(lp)) - { - switch (lp) - { - case LenientParsing.DateTime: - if (!lenient.HasFlag(LenientParsing.SetInitialDateIfNull)) - { - converters.Add(new LenientDateTimeConverter()); - } - else - { - converters.Add(new LenientDateTimeConverter(new DateTime())); - } - break; - case LenientParsing.EnumList: - converters.Add(new LenientEnumListConverter()); - break; - case LenientParsing.Bo4eUri: - converters.Add(new LenientBo4eUriConverter()); - break; - // case LenientParsing.EmptyLists: - // converters.Add(new LenientRequiredListConverter()); - // break; - - // no default case because NONE and MOST_LENIENT do not come up with more converters - } - } - } - IContractResolver contractResolver; - if (userPropertiesWhiteList.Count > 0) - { - contractResolver = new UserPropertiesDataContractResolver(userPropertiesWhiteList); - } - else - { - contractResolver = new DefaultContractResolver(); - } - JsonSerializerSettings settings = new JsonSerializerSettings - { - Converters = converters, - DateParseHandling = DateParseHandling.None, - ContractResolver = contractResolver - }; + var settings = lenient.GetJsonSerializerSettings(); return (BusinessObject)JsonConvert.DeserializeObject(jobject.ToString(), businessObjectType, settings); } } @@ -183,62 +139,6 @@ public static BusinessObject MapObject(Type businessObjectType, JObject jobject, } } - public static JsonSerializerSettings GetJsonSerializerSettings(LenientParsing lenient) - { - return GetJsonSerializerSettings(new HashSet(), lenient); - } - - public static JsonSerializerSettings GetJsonSerializerSettings(HashSet userPropertiesWhiteList, LenientParsing lenient = LenientParsing.Strict) - { - List converters = new List(); - foreach (LenientParsing lp in Enum.GetValues(typeof(LenientParsing))) - { - if (lenient.HasFlag(lp)) - { - switch (lp) - { - case LenientParsing.DateTime: - if (!lenient.HasFlag(LenientParsing.SetInitialDateIfNull)) - { - converters.Add(new LenientDateTimeConverter()); - } - else - { - converters.Add(new LenientDateTimeConverter(new DateTime())); - } - break; - case LenientParsing.EnumList: - converters.Add(new LenientEnumListConverter()); - break; - case LenientParsing.Bo4eUri: - converters.Add(new LenientBo4eUriConverter()); - break; - // case LenientParsing.EmptyLists: - // converters.Add(new LenientRequiredListConverter()); - // break; - - // no default case because NONE and MOST_LENIENT do not come up with more converters - } - } - } - IContractResolver contractResolver; - if (userPropertiesWhiteList.Count > 0) - { - contractResolver = new UserPropertiesDataContractResolver(userPropertiesWhiteList); - } - else - { - contractResolver = new DefaultContractResolver(); - } - JsonSerializerSettings settings = new JsonSerializerSettings - { - Converters = converters, - DateParseHandling = DateParseHandling.None, - ContractResolver = contractResolver - }; - return settings; - } - /// /// /// @@ -361,11 +261,12 @@ public static JSchema GetJsonSchemeFor(Type businessObjectType) /// /// name of the business object in title caseMesslokation /// Array of FieldInfos + [Obsolete("Fields are only private version 1.1", true)] public static FieldInfo[] GetAnnotatedFields(string boName) { return GetAnnotatedFields(boName, typeof(DataCategoryAttribute)); } - + [Obsolete("Fields are only private version 1.1", true)] public static FieldInfo[] GetAnnotatedFields(Type type) { return GetAnnotatedFields(type, typeof(DataCategoryAttribute)); @@ -378,6 +279,7 @@ public static FieldInfo[] GetAnnotatedFields(Type type) /// type of the business object /// type of the attribute/annotation you're interested intypeof(DataCategoryAttribute) /// Array of FieldInfos + [Obsolete("Fields are only private version 1.1",true)] public static FieldInfo[] GetAnnotatedFields(Type boType, Type attributeType) { return boType.GetFields() @@ -393,6 +295,7 @@ public static FieldInfo[] GetAnnotatedFields(Type boType, Type attributeType) /// name of the business object in title caseMesslokation /// type of the attribute/annotation you're interested intypeof(DataCategoryAttribute) /// Array of FieldInfos + [Obsolete("Fields are only private version 1.1",true)] public static FieldInfo[] GetAnnotatedFields(string boName, Type attributeType) { return Assembly.GetExecutingAssembly().GetTypes() @@ -402,235 +305,5 @@ public static FieldInfo[] GetAnnotatedFields(string boName, Type attributeType) .OrderBy(af => af.GetCustomAttribute()?.Order) .ToArray(); } - - private class LenientEnumListConverter : JsonConverter - { - - public override bool CanConvert(Type objectType) - { - if (!objectType.IsGenericType) - { - return false; - } - if (objectType.GetGenericTypeDefinition() != typeof(List<>)) - { - return false; - } - Type expectedListElementType = objectType.GetGenericArguments()[0]; - return expectedListElementType.ToString().StartsWith("BO4E.ENUM"); - } - - public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) - { - JToken token = JToken.Load(reader); // https://stackoverflow.com/a/47864946/10009545 - List rawList = token.ToObject>(); - Type expectedListElementType = objectType.GetGenericArguments()[0]; - Type expectedListType = typeof(List<>).MakeGenericType(expectedListElementType); - object result = Activator.CreateInstance(expectedListType); - if (rawList == null || rawList.Count == 0) - { - return result; - } - // First try to parse the List normally, in case it's formatted as expected - foreach (var rawItem in rawList) - { - if (rawItem.GetType() == typeof(string) && Enum.IsDefined(expectedListElementType, rawItem.ToString())) - { - // default. everything is as it should be :-) - object enumValue = Enum.Parse(expectedListElementType, rawItem.ToString()); - ((IList)result).Add(enumValue); - } - else if (rawItem.GetType() == typeof(JObject)) - { - Dictionary rawDict = ((JObject)rawItem).ToObject>(); - object rawObject = rawDict.Values.FirstOrDefault(); - object enumValue = Enum.Parse(expectedListElementType, rawObject.ToString()); - ((IList)result).Add(enumValue); - } - else - { - ((IList)result).Add(rawItem); - } - } - return result; - } - - public override bool CanWrite - { - get { return false; } - } - - public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) - { - throw new NotImplementedException(); - } - } - - /// - /// The lenient DateTimeConverter allows for transforming strings into (nullable) DateTime(?) objects, - /// even if their formatting is somehow weird. - /// - public class LenientDateTimeConverter : JsonConverter - { - // basic structure copied from https://stackoverflow.com/a/33172735/10009545 - - private readonly DateTime? _defaultDateTime; - - public LenientDateTimeConverter(DateTime? defaultDateTime = null) - { - this._defaultDateTime = defaultDateTime; - } - - public LenientDateTimeConverter() : this(null) - { - - } - - private readonly List ALLOWED_DATETIME_FORMATS = new List() - { - "yyyyMMddHHmm", - "yyyyMMddHHmmss", - @"yyyyMMddHHmmss'--T::zzzz'", // ToDo: remove again. this is just a buggy, nasty workaround - }; - - public override bool CanConvert(Type objectType) - { - return (objectType == typeof(DateTime) || objectType == typeof(DateTime?)); - } - - public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) - { - string rawDate; - if (reader.Value == null) - { - return null; - } - else if (reader.Value as string != null) - { - rawDate = (string)reader.Value; - } - else if (reader.Value.GetType() == typeof(DateTime)) - { - return (DateTime)reader.Value; - } - else - { - rawDate = reader.Value.ToString(); - } - // First try to parse the date string as is (in case it is correctly formatted) - if (DateTime.TryParse(rawDate, out DateTime date)) - { - return date; - } - - foreach (string dtf in ALLOWED_DATETIME_FORMATS) - { - if (DateTime.TryParseExact(rawDate, dtf, CultureInfo.InvariantCulture, DateTimeStyles.None, out date)) - { - return date; - } - } - - // It's not a date after all, so just return the default value - if (objectType == typeof(DateTime?)) - { - return null; - } - if (this._defaultDateTime.HasValue) - { - return _defaultDateTime; - } - else - { - throw new JsonReaderException($"Couldn't convert {rawDate} to any of the allowed date time formats: {String.Join(";", ALLOWED_DATETIME_FORMATS)})"); - } - } - - public override bool CanWrite - { - get { return false; } - } - - public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) - { - throw new NotImplementedException(); - } - } - - private class LenientBo4eUriConverter : JsonConverter - { - public override bool CanConvert(Type objectType) - { - return (objectType == typeof(Bo4eUri)); - } - - public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) - { - if (reader.Value == null) - { - return null; - } - string rawString = (string)reader.Value; - if (rawString.Trim() == String.Empty) - { - return null; - } - return new Bo4eUri(rawString); - } - - public override bool CanWrite - { - get { return false; } - } - - public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) - { - throw new NotImplementedException(); - } - } - - /// - /// The UserPropertiesContractResolver allows to put non-BO4E-standard/custom fields/properties into a "userProperties" object. - /// - public class UserPropertiesDataContractResolver : DefaultContractResolver - { - public static readonly UserPropertiesDataContractResolver Instance = new UserPropertiesDataContractResolver(new HashSet()); - - private readonly HashSet whitelist; - - /// - /// The UserPropertiesDataContractResolver is initialised with a white list of allowed properties. Everything else is discarded. - /// - /// white list of properties (actually a white"set") - public UserPropertiesDataContractResolver(HashSet userPropertiesWhiteList) - { - whitelist = userPropertiesWhiteList; - } - - public override JsonContract ResolveContract(Type type) - { - JsonContract contract = base.ResolveContract(type); - if (contract is JsonObjectContract objContract) - { - if (objContract.ExtensionDataSetter != null) - { - ExtensionDataSetter oldSetter = objContract.ExtensionDataSetter; - objContract.ExtensionDataSetter = (o, key, value) => - { - if (whitelist.Contains(key)) - { - oldSetter(o, key, value); - } - else - { - int a = 0; - a++; - } - }; - } - } - return contract; - } - } } } diff --git a/BO4E-dotnet/COM/Adresse.cs b/BO4E-dotnet/COM/Adresse.cs index 230de465..fc5a8c2c 100644 --- a/BO4E-dotnet/COM/Adresse.cs +++ b/BO4E-dotnet/COM/Adresse.cs @@ -1,6 +1,8 @@ using BO4E.ENUM; using BO4E.meta; + using Newtonsoft.Json; + using ProtoBuf; namespace BO4E.COM @@ -11,53 +13,53 @@ public class Adresse : COM { /// Die Postleitzahl. Beispiel: 41836 [DataCategory(DataCategory.ADDRESS)] - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "postleitzahl", Required = Required.Always)] [FieldName("zipCode", Language.EN)] [ProtoMember(3)] - public string postleitzahl; + public string Postleitzahl { get; set; } /// Bezeichnung der Stadt. Beispiel Hückelhoven [DataCategory(DataCategory.ADDRESS)] - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "ort", Required = Required.Always)] [FieldName("city", Language.EN)] [ProtoMember(4)] - public string ort; + public string Ort { get; set; } /// Bezeichnung der Straße. Beispiel: Weserstraße [DataCategory(DataCategory.ADDRESS)] - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "strasse", Required = Required.Default)] [FieldName("street", Language.EN)] [ProtoMember(5)] - public string strasse; + public string Strasse { get; set; } /// Hausnummer inkl. Zusatz. Beispiel. 3, 4a etc. [DataCategory(DataCategory.ADDRESS)] - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "hausnummer", Required = Required.Default)] [FieldName("houseNumber", Language.EN)] [ProtoMember(6)] - public string hausnummer; + public string Hausnummer { get; set; } /// /// Im Falle einer Postfachadresse das Postfach. Damit werden Straße und /// Hausnummer nicht berücksichtigt.Beispiel: Postfach 4711 /// [DataCategory(DataCategory.ADDRESS)] - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "postfach", Required = Required.Default)] [ProtoMember(7)] - public string postfach; + public string Postfach { get; set; } /// Zusatzhinweis zum Auffinden der Adresse, z.B. "3. Stock linke Wohnung" [DataCategory(DataCategory.ADDRESS)] - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "adresszusatz", Required = Required.Default)] [ProtoMember(8)] - public string adresszusatz; + public string Adresszusatz { get; set; } /// Im Falle einer c/o-Adresse steht in diesem Attribut die Anrede. Z.B. c/o /// Veronica Hauptmieterin.In diesem Fall enthält die folgende Adresse die Daten ///der in c/o adressierten Person oder Firma. [DataCategory(DataCategory.ADDRESS)] - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "coErgaenzung", Required = Required.Default)] [ProtoMember(9)] - public string coErgaenzung; - /// Offizieller ISO-Landescode. Z.B. NL, Details + public string CoErgaenzung { get; set; } + /// Offizieller ISO-Landescode. Z.B. NL, Details [DataCategory(DataCategory.ADDRESS)] - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "landescode", Required = Required.Default)] [FieldName("countryCode", Language.EN)] [ProtoMember(10)] - public Landescode? landescode; + public Landescode? Landescode { get; set; } } } diff --git a/BO4E-dotnet/COM/Angebotsposition.cs b/BO4E-dotnet/COM/Angebotsposition.cs index 5860adf3..e5b0523b 100644 --- a/BO4E-dotnet/COM/Angebotsposition.cs +++ b/BO4E-dotnet/COM/Angebotsposition.cs @@ -1,5 +1,6 @@ using Newtonsoft.Json; + using ProtoBuf; namespace BO4E.COM @@ -9,20 +10,20 @@ namespace BO4E.COM public class Angebotsposition : COM { /// Bezeichnung der jeweiligen Position des Angebotsteils. - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "positionsbezeichung", Required = Required.Always)] [ProtoMember(3)] - public string positionsbezeichung; + public string Positionsbezeichung { get; set; } /// Summe der Verbräuche (z.B. in kWh), die zu dieser Angebotsposition gehören. Details - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "positionsmenge", Required = Required.Default)] [ProtoMember(4)] - public Menge positionsmenge; + public Menge Positionsmenge { get; set; } /// Preis pro Einheit/Stückpreis der jeweiligen Angebotsposition. Details - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "positionspreis", Required = Required.Always)] [ProtoMember(5)] - public Preis positionspreis; + public Preis Positionspreis { get; set; } /// Kosten (PositionsPreis * PositionsStückzahl) für diese Angebotsposition. Details - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "positionsbetrag", Required = Required.Default)] [ProtoMember(6)] - public Betrag positionsbetrag; // or positionskosten?? + public Betrag Positionsbetrag { get; set; } // or positionskosten?? } } \ No newline at end of file diff --git a/BO4E-dotnet/COM/Angebotsteil.cs b/BO4E-dotnet/COM/Angebotsteil.cs index 5fcc2697..4d9d2d9e 100644 --- a/BO4E-dotnet/COM/Angebotsteil.cs +++ b/BO4E-dotnet/COM/Angebotsteil.cs @@ -1,7 +1,9 @@ using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; + using BO4E.BO; + using Newtonsoft.Json; + using ProtoBuf; namespace BO4E.COM @@ -11,28 +13,28 @@ namespace BO4E.COM public class Angebotsteil : COM { /// Identifizierung eines Subkapitels einer Anfrage, beispielsweise das Los einer Ausschreibung. - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "anfrageSubreferenz", Required = Required.Default)] [ProtoMember(3)] - public string anfrageSubreferenz; + public string AnfrageSubreferenz { get; set; } /// Marktlokationen, für die dieses Angebotsteil gilt, falls vorhanden. Durch die Marktlokation ist auch die Lieferadresse festgelegt. Details - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "lieferstellenangebotsteil", Required = Required.Default)] [ProtoMember(4)] - public List lieferstellenangebotsteil; + public List Lieferstellenangebotsteil { get; set; } /// Summe der Verbräuche aller in diesem Angebotsteil eingeschlossenen Lieferstellen. Details - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "gesamtmengeangebotsteil", Required = Required.Default)] [ProtoMember(5)] - public Menge gesamtmengeangebotsteil; + public Menge Gesamtmengeangebotsteil { get; set; } /// Summe der Jahresenergiekosten aller in diesem Angebotsteil enthaltenen Lieferstellen. Details - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "gesamtkostenangebotsteil", Required = Required.Default)] [ProtoMember(6)] - public Betrag gesamtkostenangebotsteil; + public Betrag Gesamtkostenangebotsteil { get; set; } /// Einzelne Positionen, die zu diesem Angebotsteil gehören. Details - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "positionen", Required = Required.Always)] [ProtoMember(7)] - public List positionen; + public List Positionen { get; set; } } } diff --git a/BO4E-dotnet/COM/Angebotsvariante.cs b/BO4E-dotnet/COM/Angebotsvariante.cs index cc687ddf..0a936e34 100644 --- a/BO4E-dotnet/COM/Angebotsvariante.cs +++ b/BO4E-dotnet/COM/Angebotsvariante.cs @@ -1,7 +1,10 @@ using System; using System.Collections.Generic; + using BO4E.ENUM; + using Newtonsoft.Json; + using ProtoBuf; namespace BO4E.COM @@ -10,33 +13,33 @@ namespace BO4E.COM [ProtoContract] public class Angebotsvariante : COM { - /// Gibt den Status eines Angebotes an.  - [JsonProperty(Required = Required.Always)] + /// Gibt den Status eines Angebotes an.  + [JsonProperty(PropertyName = "angebotsstatus", Required = Required.Always)] [ProtoMember(4)] - public Angebotsstatus angebotsstatus; + public Angebotsstatus Angebotsstatus { get; set; } /// Umschreibung des Inhalts der Angebotsvariante. - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "beschreibung", Required = Required.Default)] [ProtoMember(5)] - public string beschreibung; + public string Beschreibung { get; set; } /// Datum der Erstellung der Angebotsvariante - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "erstelldatum", Required = Required.Default)] [ProtoMember(6)] - public DateTime erstelldatum; + public DateTime Erstelldatum { get; set; } /// Bis zu diesem Zeitpunkt (Tag/Uhrzeit) inklusive gilt die Angebotsvariante, z.B. 31.12.2017, 17:00 Uhr. - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "bindefrist", Required = Required.Always)] [ProtoMember(7)] - public DateTime bindefrist; + public DateTime Bindefrist { get; set; } /// Aufsummierte Wirkarbeitsmenge aller Angebotsteile. - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "gesamtmenge", Required = Required.Default)] [ProtoMember(8)] - public Menge gesamtmenge; + public Menge Gesamtmenge { get; set; } /// Aufsummierte Kosten aller Angebotsteile. - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "gesamtkosten", Required = Required.Default)] [ProtoMember(9)] - public Betrag gesamtkosten; + public Betrag Gesamtkosten { get; set; } /// Angebotsteile werden im einfachsten Fall für eine Marktlokation oder Lieferstellenadresse erzeugt. Hier werden die Mengen und Gesamtkosten aller Angebotspositionen zusammengefasst. Eine Variante besteht mindestens aus einem Angebotsteil. Details - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "teile", Required = Required.Always)] [ProtoMember(10)] - public List teile; + public List Teile { get; set; } } } \ No newline at end of file diff --git a/BO4E-dotnet/COM/AufAbschlag.cs b/BO4E-dotnet/COM/AufAbschlag.cs index 8a0672ec..a1591085 100644 --- a/BO4E-dotnet/COM/AufAbschlag.cs +++ b/BO4E-dotnet/COM/AufAbschlag.cs @@ -1,6 +1,9 @@ using System.Collections.Generic; + using BO4E.ENUM; + using Newtonsoft.Json; + using ProtoBuf; namespace BO4E.COM @@ -10,36 +13,36 @@ namespace BO4E.COM public class AufAbschlag : COM { /// Bezeichnung des Auf-/Abschlags - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "bezeichnung", Required = Required.Always)] [ProtoMember(3)] - public string bezeichnung; + public string Bezeichnung { get; set; } /// Beschreibung zum Auf-/Abschlag - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "beschreibung", Required = Required.Default)] [ProtoMember(4)] - public string beschreibung; - /// Typ des Aufabschlages (z.B. absolut oder prozentual). Details - [JsonProperty(Required = Required.Default)] + public string Beschreibung { get; set; } + /// Typ des Aufabschlages (z.B. absolut oder prozentual). Details + [JsonProperty(PropertyName = "aufAbschlagstyp", Required = Required.Default)] [ProtoMember(5)] - public AufAbschlagstyp? aufAbschlagstyp; + public AufAbschlagstyp? AufAbschlagstyp { get; set; } /// Diesem Preis oder den Kosten ist der Auf/Abschlag zugeordnet. Z.B. Arbeitspreis, Gesamtpreis etc.. Details - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "aufAbschlagsziel", Required = Required.Default)] [ProtoMember(6)] - public AufAbschlagsziel? aufAbschlagsziel; + public AufAbschlagsziel? aufAbschlagsziel { get; set; } /// Gibt an in welcher Währungseinheit der Auf/Abschlag berechnet wird. Euro oder Ct.. (Nur im Falle absoluter Aufschlagstypen). Details - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "einheit", Required = Required.Default)] [ProtoMember(7)] - public Waehrungseinheit? einheit; + public Waehrungseinheit? Einheit { get; set; } /// Internetseite, auf der die Informationen zum Auf-/Abschlag veröffentlicht sind. - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "website", Required = Required.Default)] [ProtoMember(8)] - public string website; + public string Website { get; set; } /// Zeitraum, in dem der Abschlag zur Anwendung kommen kann. Details - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "gueltigkeitszeitraum", Required = Required.Default)] [ProtoMember(9)] - public Zeitraum gueltigkeitszeitraum; + public Zeitraum Gueltigkeitszeitraum { get; set; } /// Werte für die gestaffelten Auf/Abschläge. Details - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "staffeln", Required = Required.Always)] [ProtoMember(10)] - public List staffeln; + public List Staffeln { get; set; } } } \ No newline at end of file diff --git a/BO4E-dotnet/COM/Aufgabe.cs b/BO4E-dotnet/COM/Aufgabe.cs index 62f8c27b..328d7fb2 100644 --- a/BO4E-dotnet/COM/Aufgabe.cs +++ b/BO4E-dotnet/COM/Aufgabe.cs @@ -1,62 +1,65 @@ -using System; +using System; + using BO4E.meta; -using Newtonsoft.Json; +using BO4E.meta.LenientConverters; + +using Newtonsoft.Json; + using ProtoBuf; -using static BO4E.BoMapper; - -namespace BO4E.COM -{ - /// - /// Aufgabe als Teil einer . - /// Aufgaben entsprechen den Klärfall-Lösungsmethoden im SAP. - /// - [NonOfficial(NonOfficialCategory.CUSTOMER_REQUIREMENTS)] - [ProtoContract] - public class Aufgabe : COM - { - /// - /// Eindeutige Kennzeichnung der Aufgabe - /// - [JsonProperty(Required = Required.Always)] - [ProtoMember(3)] - public string aufgabenId; - - /// - /// Optionale Beschreibung der Aufgabe - /// - [JsonProperty(Required = Required.Default)] - [ProtoMember(4)] - public string beschreibung; - - /// - /// Optionale Deadline bis zu der die Aufgabe ausführt werden kann oder ihre Ausführung - /// sinnvoll ist. - /// - [JsonProperty(Required = Required.Default)] - [ProtoMember(5)] - public DateTime? deadline; - - /// - /// Wurde diese Aufgabe schon ausgeführt (true)? Steht sie noch zur Bearbeitung an (false)? - /// - [JsonProperty(Required = Required.Always)] - [ProtoMember(6)] - public bool ausgefuehrt; - - /// - /// Zeitpunkt zu dem die Aufgabe ausgeführt wurde. (Nur sinnvoll, wenn ausgefuehrt==true) - /// - [JsonConverter(typeof(LenientDateTimeConverter))] - [JsonProperty(Required = Required.Default)] - [ProtoMember(7)] - public DateTime? ausfuehrungszeitpunkt; - - /// - /// Eindeutige Kennung des Benutzers, der diese Aufgabe ausführt hat. - /// (Nur sinnvoll, wenn ausgefuehrt==true) - /// - [JsonProperty(Required = Required.Default)] - [ProtoMember(8)] - public string ausfuehrender; - } + +namespace BO4E.COM +{ + /// + /// Aufgabe als Teil einer . + /// Aufgaben entsprechen den Klärfall-Lösungsmethoden im SAP. + /// + [NonOfficial(NonOfficialCategory.CUSTOMER_REQUIREMENTS)] + [ProtoContract] + public class Aufgabe : COM + { + /// + /// Eindeutige Kennzeichnung der Aufgabe + /// + [JsonProperty(PropertyName = "aufgabenId", Required = Required.Always)] + [ProtoMember(3)] + public string AufgabenId { get; set; } + + /// + /// Optionale Beschreibung der Aufgabe + /// + [JsonProperty(PropertyName = "beschreibung", Required = Required.Default)] + [ProtoMember(4)] + public string Beschreibung { get; set; } + + /// + /// Optionale Deadline bis zu der die Aufgabe ausführt werden kann oder ihre Ausführung + /// sinnvoll ist. + /// + [JsonProperty(PropertyName = "deadline", Required = Required.Default)] + [ProtoMember(5)] + public DateTime? Deadline { get; set; } + + /// + /// Wurde diese Aufgabe schon ausgeführt (true)? Steht sie noch zur Bearbeitung an (false)? + /// + [JsonProperty(PropertyName = "ausgefuehrt", Required = Required.Always)] + [ProtoMember(6)] + public bool Ausgefuehrt { get; set; } + + /// + /// Zeitpunkt zu dem die Aufgabe ausgeführt wurde. (Nur sinnvoll, wenn ausgefuehrt==true) + /// + [JsonConverter(typeof(LenientDateTimeConverter))] + [JsonProperty(PropertyName = "ausfuehrungszeitpunkt", Required = Required.Default)] + [ProtoMember(7)] + public DateTime? Ausfuehrungszeitpunkt { get; set; } + + /// + /// Eindeutige Kennung des Benutzers, der diese Aufgabe ausführt hat. + /// (Nur sinnvoll, wenn ausgefuehrt==true) + /// + [JsonProperty(PropertyName = "ausfuehrender", Required = Required.Default)] + [ProtoMember(8)] + public string Ausfuehrender { get; set; } + } } \ No newline at end of file diff --git a/BO4E-dotnet/COM/Ausschreibungsdetail.cs b/BO4E-dotnet/COM/Ausschreibungsdetail.cs index 21baea93..0cff7cf4 100644 --- a/BO4E-dotnet/COM/Ausschreibungsdetail.cs +++ b/BO4E-dotnet/COM/Ausschreibungsdetail.cs @@ -9,64 +9,64 @@ namespace BO4E.COM public class Ausschreibungsdetail : COM { /// Identifikation einer ausgeschriebenen Marktlokation - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName="lokationsId", Required = Required.Always)] [ProtoMember(3)] - public string lokationsId; + public string LokationsId { get;set; } /// Bezeichnung für die Lokation, z.B. Zentraler Einkauf, Hamburg - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName="lokationsbezeichung", Required = Required.Default)] [ProtoMember(4)] - public string lokationsbezeichung; + public string Lokationsbezeichung { get;set; } /// In der angegebenen Netzebene wird die Marktlokation versorgt, z.B. MSP für Mittelspanung. Details - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName="netzebeneLieferung", Required = Required.Always)] [ProtoMember(5)] - public Netzebene netzebeneLieferung; + public Netzebene NetzebeneLieferung { get;set; } /// In der angegebenen Netzebene wird die Lokation gemessen, z.B. NSP für Niederspanung. Details - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName="netzebeneMessung", Required = Required.Always)] [ProtoMember(6)] - public Netzebene netzebeneMessung; + public Netzebene NetzebeneMessung { get;set; } /// Bezeichnung des zuständigen Netzbetreibers, z.B. Stromnetz Hamburg GmbH. - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName="netzbetreiber", Required = Required.Default)] [ProtoMember(7)] - public string netzbetreiber; + public string Netzbetreiber { get;set; } /// Bezeichnung des Kunden, der die Marktlokation nutzt. - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName="kunde", Required = Required.Default)] [ProtoMember(8)] - public string kunde; + public string Kunde { get;set; } /// Die Bezeichnung des Zählers an der Marktlokation - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName="zaehlernummer", Required = Required.Default)] [ProtoMember(9)] - public string zaehlernummer; + public string Zaehlernummer { get;set; } /// Spezifikation, um welche Zählertechnik es sich im vorliegenden Fall handelt, z.B. Leistungsmessung. Details - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName="zaehlertechnik", Required = Required.Default)] [ProtoMember(10)] - public Zaehlertyp? zaehlertechnik; + public Zaehlertyp? Zaehlertechnik { get;set; } /// Zeigt an, ob es zu der Marktlokation einen Lastgang gibt. Falls ja, kann dieser abgerufen werden und daraus die Verbrauchswerte ermittelt werden. - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName="lastgangVorhanden", Required = Required.Default)] [ProtoMember(11)] - public bool? lastgangVorhanden; + public bool? LastgangVorhanden { get;set; } /// Die Adresse an der die Marktlokation sich befindet. Struktur - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName="lokationsadresse", Required = Required.Always)] [ProtoMember(12)] - public Adresse lokationsadresse; + public Adresse Lokationsadresse { get;set; } /// Die (evtl. abweichende) Rechnungsadresse. Struktur - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName="rechnungsadresse", Required = Required.Default)] [ProtoMember(13)] - public Adresse rechnungsadresse; + public Adresse Rechnungsadresse { get;set; } /// Prognosewert für die Jahresarbeit der ausgeschriebenen Lokation. Struktur - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName="prognoseJahresarbeit", Required = Required.Default)] [ProtoMember(14)] - public Menge prognoseJahresarbeit; + public Menge PrognoseJahresarbeit { get;set; } /// Ein Prognosewert für die Arbeit innerhalb des angefragten Lieferzeitraums der ausgeschriebenen Lokation. Struktur - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName="prognoseArbeitLieferzeitraum", Required = Required.Default)] [ProtoMember(15)] - public Menge prognoseArbeitLieferzeitraum; + public Menge PrognoseArbeitLieferzeitraum { get;set; } /// Prognosewert für die abgenommene maximale Leistung der ausgeschriebenen Lokation. Struktur - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName="prognoseLeistung", Required = Required.Default)] [ProtoMember(16)] - public Menge prognoseLeistung; + public Menge PrognoseLeistung { get;set; } /// Angefragter Zeitraum für die ausgeschriebene Belieferung. - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName="lieferzeitraum", Required = Required.Default)] [ProtoMember(17)] - public Zeitraum lieferzeitraum; + public Zeitraum Lieferzeitraum { get;set; } } } \ No newline at end of file diff --git a/BO4E-dotnet/COM/Ausschreibungslos.cs b/BO4E-dotnet/COM/Ausschreibungslos.cs index 20814cb5..fa03f27b 100644 --- a/BO4E-dotnet/COM/Ausschreibungslos.cs +++ b/BO4E-dotnet/COM/Ausschreibungslos.cs @@ -1,6 +1,9 @@ using System.Collections.Generic; + using BO4E.ENUM; + using Newtonsoft.Json; + using ProtoBuf; namespace BO4E.COM @@ -10,72 +13,72 @@ namespace BO4E.COM public class Ausschreibungslos : COM { /// Laufende Nummer des Loses - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "losnummer", Required = Required.Always)] [ProtoMember(3)] - public string losnummer; + public string Losnummer { get; set; } /// Bezeichnung der Ausschreibung - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "bezeichung", Required = Required.Always)] [ProtoMember(4)] - public string bezeichung; + public string Bezeichung { get; set; } /// Bemerkung des Kunden zur Ausschreibung - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "bemerkung", Required = Required.Default)] [ProtoMember(5)] - public string bemerkung; - /// Bezeichnung der Preismodelle in Ausschreibungen für die Energielieferung. Details - [JsonProperty(Required = Required.Always)] + public string Bemerkung { get; set; } + /// Bezeichnung der Preismodelle in Ausschreibungen für die Energielieferung. Details + [JsonProperty(PropertyName = "preismodell", Required = Required.Always)] [ProtoMember(6)] - public Preismodell preismodell; + public Preismodell Preismodell { get; set; } /// Unterscheidungsmöglichkeiten für die Sparte. Details - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "energieart", Required = Required.Always)] [ProtoMember(7)] - public Sparte energieart; + public Sparte Energieart { get; set; } /// Aufzählung der Möglichkeiten zur Rechnungslegung in Ausschreibungen. Details - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "wunschRechnungslegung", Required = Required.Always)] [ProtoMember(8)] - public Rechnungslegung wunschRechnungslegung; + public Rechnungslegung WunschRechnungslegung { get; set; } /// Aufzählung der Möglichkeiten zu Vertragsformen in Ausschreibungen. Details - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "wunschVertragsform", Required = Required.Always)] [ProtoMember(9)] - public Vertragsform wunschVertragsform; + public Vertragsform WunschVertragsform { get; set; } /// Name des Lizenzpartners - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "betreutDurch", Required = Required.Always)] [ProtoMember(10)] - public string betreutDurch; + public string BetreutDurch { get; set; } /// Anzahl der Lieferstellen in dieser Ausschreibung - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "anzahlLieferstellen", Required = Required.Always)] [ProtoMember(11)] - public int anzahlLieferstellen; // does this make sense? lieferstellen.Size()? + public int AnzahlLieferstellen { get; set; } // does this make sense? lieferstellen.Size()? /// Die ausgeschriebenen Lieferstellen. Details - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "lieferstellen", Required = Required.Always)] [ProtoMember(12)] - public List lieferstellen; + public List Lieferstellen { get; set; } /// Gibt den Gesamtjahresverbrauch (z.B. in kWh) aller in diesem Los enthaltenen Lieferstellen an. - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "gesamtmenge", Required = Required.Default)] [ProtoMember(13)] - public Menge gesamtmenge; + public Menge Gesamtmenge { get; set; } /// Mindestmenge Toleranzband (kWh, %) - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "wunschMindestmenge", Required = Required.Default)] [ProtoMember(14)] - public Menge wunschMindestmenge; + public Menge WunschMindestmenge { get; set; } /// Maximalmenge Toleranzband (kWh, %) - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "wunschMaximalmenge", Required = Required.Default)] [ProtoMember(15)] - public Menge wunschMaximalmenge; + public Menge WunschMaximalmenge { get; set; } /// Angabe, in welchem Intervall die Angebotsabgabe wiederholt werden darf. Angabe nur gesetzt für die 2. Phase bei öffentlich-rechtlichen Ausschreibungen, ansonsten NULL - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "wiederholungsintervall", Required = Required.Default)] [ProtoMember(16)] - public Zeitraum wiederholungsintervall; + public Zeitraum Wiederholungsintervall { get; set; } /// Zeitraum, für den die in diesem Los enthaltenen Lieferstellen beliefert werden sollen - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "lieferzeitraum", Required = Required.Default)] [ProtoMember(17)] - public Zeitraum lieferzeitraum; + public Zeitraum lieferzeitraum { get; set; } /// Kundenwunsch zur Kündigungsfrist in der Ausschreibung. - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "wunschKuendingungsfrist", Required = Required.Default)] [ProtoMember(18)] - public Zeitraum wunschKuendingungsfrist; + public Zeitraum WunschKuendingungsfrist { get; set; } /// Kundenwunsch zum Zahlungsziel in der Ausschreibung. - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "wunschZahlungsziel", Required = Required.Default)] [ProtoMember(19)] - public Zeitraum wunschZahlungsziel; + public Zeitraum WunschZahlungsziel { get; set; } } } \ No newline at end of file diff --git a/BO4E-dotnet/COM/Betrag.cs b/BO4E-dotnet/COM/Betrag.cs index 00503744..4f2dc231 100644 --- a/BO4E-dotnet/COM/Betrag.cs +++ b/BO4E-dotnet/COM/Betrag.cs @@ -1,6 +1,8 @@ using BO4E.ENUM; using BO4E.meta; + using Newtonsoft.Json; + using ProtoBuf; namespace BO4E.COM @@ -10,14 +12,14 @@ namespace BO4E.COM public class Betrag : COM { /// Gibt den Betrag des Preises an. - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "wert", Required = Required.Always)] [FieldName("value", Language.EN)] [ProtoMember(3)] - public decimal wert; + public decimal Wert { get; set; } /// - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "waehrung", Required = Required.Always)] [FieldName("currency", Language.EN)] [ProtoMember(4)] - public Waehrungscode waehrung; + public Waehrungscode Waehrung { get; set; } } } \ No newline at end of file diff --git a/BO4E-dotnet/COM/COM.cs b/BO4E-dotnet/COM/COM.cs index 7347cfca..748e4e01 100644 --- a/BO4E-dotnet/COM/COM.cs +++ b/BO4E-dotnet/COM/COM.cs @@ -72,11 +72,11 @@ public abstract class COM : IEquatable /// /// User properties (non bo4e standard) /// - [JsonProperty(PropertyName = BusinessObject.userPropertiesName, Required = Required.Default, Order = 2)] + [JsonProperty(PropertyName = BusinessObject.USER_PROPERTIES_NAME, Required = Required.Default, Order = 2)] [ProtoMember(2)] [JsonExtensionData] [DataCategory(DataCategory.USER_PROPERTIES)] - public IDictionary userProperties; + public IDictionary UserProperties { get; set; } /// /// BO4E components are considered equal iff all of their elements/fields are equal. @@ -113,13 +113,13 @@ public override int GetHashCode() unchecked { result *= this.GetType().GetHashCode(); - foreach (FieldInfo field in this.GetType().GetFields()) + foreach (var prop in this.GetType().GetProperties()) { - if (field.GetValue(this) != null) + if (prop.GetValue(this) != null) { // Using +19 because the default hash code of uninitialised enums is zero. // This would screw up the calculation such that all objects with at least one null value had the same hash code, namely 0. - result *= 19 + field.GetValue(this).GetHashCode(); + result *= 19 + prop.GetValue(this).GetHashCode(); } } return result; @@ -143,8 +143,8 @@ public bool IsValid() /// /// allows adding a GUID to COM objects for tracking across systems /// - [JsonProperty(NullValueHandling = NullValueHandling.Ignore, Required = Required.Default, Order = 1)] + [JsonProperty(PropertyName="guid", NullValueHandling = NullValueHandling.Ignore, Required = Required.Default, Order = 1)] [ProtoMember(1)] - public string guid; + public string Guid { get;set; } } } diff --git a/BO4E-dotnet/COM/Dienstleistung.cs b/BO4E-dotnet/COM/Dienstleistung.cs index 831b2130..64f1bdf1 100644 --- a/BO4E-dotnet/COM/Dienstleistung.cs +++ b/BO4E-dotnet/COM/Dienstleistung.cs @@ -1,5 +1,7 @@ using BO4E.ENUM; + using Newtonsoft.Json; + using ProtoBuf; namespace BO4E.COM @@ -8,13 +10,13 @@ namespace BO4E.COM [ProtoContract] public class Dienstleistung : COM { - /// Eindeutige Nummer der Dienstleistung. Details - [JsonProperty(Required = Required.Always)] + /// Eindeutige Nummer der Dienstleistung. Details + [JsonProperty(PropertyName = "dienstleistungstyp", Required = Required.Always)] [ProtoMember(3)] - public Dienstleistungstyp dienstleistungstyp; + public Dienstleistungstyp Dienstleistungstyp { get; set; } /// Bezeichnung der Dienstleistung. - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "bezeichnung", Required = Required.Always)] [ProtoMember(4)] - public string bezeichnung; + public string Bezeichnung { get; set; } } } \ No newline at end of file diff --git a/BO4E-dotnet/COM/Energieherkunft.cs b/BO4E-dotnet/COM/Energieherkunft.cs index 3bbbdfe7..ceb458a5 100644 --- a/BO4E-dotnet/COM/Energieherkunft.cs +++ b/BO4E-dotnet/COM/Energieherkunft.cs @@ -1,5 +1,7 @@ using BO4E.ENUM; + using Newtonsoft.Json; + using ProtoBuf; namespace BO4E.COM @@ -8,13 +10,13 @@ namespace BO4E.COM [ProtoContract] public class Energieherkunft : COM { - /// Art der Erzeugung der Energie. Details - [JsonProperty(Required = Required.Always)] + /// Art der Erzeugung der Energie. Details + [JsonProperty(PropertyName = "erzeugungsart", Required = Required.Always)] [ProtoMember(3)] - public Erzeugungsart erzeugungsart; + public Erzeugungsart Erzeugungsart { get; set; } /// Prozentualer Anteil der jeweiligen Erzeugungsart. - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "anteilProzent", Required = Required.Always)] [ProtoMember(4)] - public decimal anteilProzent; + public decimal AnteilProzent { get; set; } } } \ No newline at end of file diff --git a/BO4E-dotnet/COM/Energiemix.cs b/BO4E-dotnet/COM/Energiemix.cs index 7078de0f..1ca1f6dc 100644 --- a/BO4E-dotnet/COM/Energiemix.cs +++ b/BO4E-dotnet/COM/Energiemix.cs @@ -1,6 +1,9 @@ using System.Collections.Generic; + using BO4E.ENUM; + using Newtonsoft.Json; + using ProtoBuf; namespace BO4E.COM @@ -10,52 +13,52 @@ namespace BO4E.COM public class Energiemix : COM { /// Eindeutige Nummer zur Identifizierung des Energiemixes. - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "energiemixnummer", Required = Required.Always)] [ProtoMember(3)] - public int energiemixnummer; + public int Energiemixnummer { get; set; } /// Strom oder Gas etc.. Details - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "energieart", Required = Required.Always)] [ProtoMember(4)] - public Sparte energieart; + public Sparte Energieart { get; set; } /// Bezeichnung des Energiemix. - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "bezeichnung", Required = Required.Always)] [ProtoMember(5)] - public string bezeichnung; + public string Bezeichnung { get; set; } /// Bemerkung zum Energiemix. - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "bemerkung", Required = Required.Default)] [ProtoMember(6)] - public string bemerkung; + public string Bemerkung { get; set; } /// Jahr, für das der Energiemix gilt. - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "gueltigkeitsjahr", Required = Required.Always)] [ProtoMember(7)] - public int gueltigkeitsjahr; + public int Gueltigkeitsjahr { get; set; } /// Höhe des erzeugten CO2-Ausstosses in g/kWh. - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "cO2Emission", Required = Required.Default)] [ProtoMember(8)] - public decimal? cO2Emission; + public decimal? CO2Emission { get; set; } /// Höhe des erzeugten Atommülls in g/kWh. - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "atommuell", Required = Required.Default)] [ProtoMember(9)] - public decimal? atommuell; + public decimal? Atommuell { get; set; } /// Zertifikat für den Energiemix. Details - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "oekozertifikat", Required = Required.Default)] [ProtoMember(10)] - public List oekozertifikat; - /// Ökolabel für den Energiemix. Details - [JsonProperty(Required = Required.Default)] + public List oekozertifikat { get; set; } + /// Ökolabel für den Energiemix. Details + [JsonProperty(PropertyName = "oekolabel", Required = Required.Default)] [ProtoMember(11)] - public List oekolabel; + public List Oekolabel { get; set; } /// Kennzeichen, ob der Versorger zu den Öko Top Ten gehört. - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "oekoTopTen", Required = Required.Default)] [ProtoMember(12)] - public bool? oekoTopTen; + public bool? OekoTopTen { get; set; } /// Internetseite, auf der die Strommixdaten veröffentlicht sind. - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "website", Required = Required.Default)] [ProtoMember(13)] - public string website; + public string Website { get; set; } /// Anteile der jeweiligen Erzeugungsart. Details - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "anteil", Required = Required.Always)] [ProtoMember(14)] - public List anteil; + public List Anteil { get; set; } } } \ No newline at end of file diff --git a/BO4E-dotnet/COM/GenericStringStringInfo.cs b/BO4E-dotnet/COM/GenericStringStringInfo.cs index a8b06d9d..3b773617 100644 --- a/BO4E-dotnet/COM/GenericStringStringInfo.cs +++ b/BO4E-dotnet/COM/GenericStringStringInfo.cs @@ -1,4 +1,7 @@ using System.Collections.Generic; + +using Newtonsoft.Json; + using ProtoBuf; namespace BO4E.COM @@ -13,12 +16,14 @@ public class GenericStringStringInfo : COM /// key (named differently because key is a reserved keyword) /// [ProtoMember(3)] - public string keyColumn; + [JsonProperty(PropertyName = "keyColumn")] + public string KeyColumn { get; set; } /// /// value /// [ProtoMember(4)] - public string value; + [JsonProperty(PropertyName = "value")] + public string Value { get; set; } /// /// convert object to a key value pair @@ -26,7 +31,7 @@ public class GenericStringStringInfo : COM /// public KeyValuePair ToKeyValuePair() { - return new KeyValuePair(this.keyColumn, this.value); + return new KeyValuePair(this.KeyColumn, this.Value); } } } diff --git a/BO4E-dotnet/COM/Geokoordinaten.cs b/BO4E-dotnet/COM/Geokoordinaten.cs index 05e6a049..01224160 100644 --- a/BO4E-dotnet/COM/Geokoordinaten.cs +++ b/BO4E-dotnet/COM/Geokoordinaten.cs @@ -1,4 +1,5 @@ using Newtonsoft.Json; + using ProtoBuf; namespace BO4E.COM @@ -8,12 +9,12 @@ namespace BO4E.COM public class Geokoordinaten : COM { /// Gibt den Breitengrad eines entsprechenden Ortes an. - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "breitengrad", Required = Required.Always)] [ProtoMember(3)] - public decimal breitengrad; + public decimal Breitengrad { get; set; } /// Gibt den Längengrad eines entsprechenden Ortes an. - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "laengengrad", Required = Required.Always)] [ProtoMember(4)] - public decimal laengengrad; + public decimal Laengengrad { get; set; } } } \ No newline at end of file diff --git a/BO4E-dotnet/COM/Geraet.cs b/BO4E-dotnet/COM/Geraet.cs index 5670a2d6..7d0971c7 100644 --- a/BO4E-dotnet/COM/Geraet.cs +++ b/BO4E-dotnet/COM/Geraet.cs @@ -1,4 +1,5 @@ using Newtonsoft.Json; + using ProtoBuf; namespace BO4E.COM @@ -8,12 +9,12 @@ namespace BO4E.COM public class Geraet : COM { /// Die auf dem Geräte aufgedruckte Nummer, die vom MSB vergeben wird. - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "geraetenummer", Required = Required.Default)] [ProtoMember(3)] - public string geraetenummer; - /// Festlegung der Eigenschaften des Gerätes. Z.B. Wandler MS/NS. Details - [JsonProperty(Required = Required.Default)] + public string Geraetenummer { get; set; } + /// Festlegung der Eigenschaften des Gerätes. Z.B. Wandler MS/NS. Details + [JsonProperty(PropertyName = "geraeteeigenschaften", Required = Required.Default)] [ProtoMember(4)] - public Geraeteeigenschaften geraeteeigenschaften; + public Geraeteeigenschaften Geraeteeigenschaften { get; set; } } } \ No newline at end of file diff --git a/BO4E-dotnet/COM/Geraeteeigenschaften.cs b/BO4E-dotnet/COM/Geraeteeigenschaften.cs index 91dad511..577a8c72 100644 --- a/BO4E-dotnet/COM/Geraeteeigenschaften.cs +++ b/BO4E-dotnet/COM/Geraeteeigenschaften.cs @@ -1,8 +1,12 @@ +using System; +using System.Collections.Generic; + using BO4E.ENUM; using BO4E.meta; + using Newtonsoft.Json; + using ProtoBuf; -using System.Collections.Generic; namespace BO4E.COM { @@ -10,15 +14,15 @@ namespace BO4E.COM [ProtoContract] public class Geraeteeigenschaften : COM { - /// Der Typ eines Gerätes, beispielsweise Drehstromzähler. Details - [JsonProperty(Required = Required.Always)] + /// Der Typ eines Gerätes, beispielsweise Drehstromzähler. Details + [JsonProperty(PropertyName = "geraetetyp", Required = Required.Always)] [ProtoMember(3)] - public Geraetetyp geraetetyp; + public Geraetetyp Geraetetyp { get; set; } - /// Weitere Merkmale des Geräts, zum Beispiel Mehrtarif, Eintarif etc.. Details - [JsonProperty(Required = Required.Default)] + /// Weitere Merkmale des Geräts, zum Beispiel Mehrtarif, Eintarif etc.. Details + [JsonProperty(PropertyName = "geraetemerkmal", Required = Required.Default)] [ProtoMember(4)] - public Geraetemerkmal? geraetemerkmal; + public Geraetemerkmal? Geraetemerkmal { get; set; } /// /// Für nicht feste Fields, bsw: 'faktor' @@ -26,6 +30,7 @@ public class Geraeteeigenschaften : COM [JsonProperty(Required = Required.Default)] [NonOfficial(NonOfficialCategory.CUSTOMER_REQUIREMENTS)] [ProtoMember(1005)] - public Dictionary parameter; // ToDo: add docstring + [Obsolete("Use the COM.UserProperties instead", true)] + private Dictionary Parameter { get; set; } // ToDo: add docstring } } \ No newline at end of file diff --git a/BO4E-dotnet/COM/Hardware.cs b/BO4E-dotnet/COM/Hardware.cs index 8e4eead6..712be7d3 100644 --- a/BO4E-dotnet/COM/Hardware.cs +++ b/BO4E-dotnet/COM/Hardware.cs @@ -1,6 +1,8 @@ using BO4E.ENUM; using BO4E.meta; + using Newtonsoft.Json; + using ProtoBuf; namespace BO4E.COM @@ -9,35 +11,35 @@ namespace BO4E.COM [ProtoContract] public class Hardware : COM { - /// Eindeutiger Typ der Hardware. Details - [JsonProperty(Required = Required.Always)] + /// Eindeutiger Typ der Hardware. Details + [JsonProperty(PropertyName = "geraetetyp", Required = Required.Always)] [ProtoMember(3)] - public Geraetetyp geraetetyp; + public Geraetetyp Geraetetyp { get; set; } /// Bezeichnung der Hardware. - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "bezeichnung", Required = Required.Always)] [ProtoMember(4)] - public string bezeichnung; + public string Bezeichnung { get; set; } /// Bezeichnung der Hardware. - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "geraeteeigenschaften", Required = Required.Default)] [NonOfficial(NonOfficialCategory.CUSTOMER_REQUIREMENTS)] [ProtoMember(1005)] - public Geraeteeigenschaften geraeteeigenschaften; + public Geraeteeigenschaften Geraeteeigenschaften { get; set; } /// /// Gerätenummer des Wandlers /// - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "geraetenummer", Required = Required.Default)] [NonOfficial(NonOfficialCategory.CUSTOMER_REQUIREMENTS)] [ProtoMember(1006)] - public string geraetenummer; + public string Geraetenummer { get; set; } /// /// Referenz auf die Gerätenummer des Zählers /// - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "geraetereferenz", Required = Required.Default)] [NonOfficial(NonOfficialCategory.CUSTOMER_REQUIREMENTS)] [ProtoMember(1007)] - public string geraetereferenz; + public string Geraetereferenz { get; set; } } } \ No newline at end of file diff --git a/BO4E-dotnet/COM/Katasteradresse.cs b/BO4E-dotnet/COM/Katasteradresse.cs index 96063398..a97ec028 100644 --- a/BO4E-dotnet/COM/Katasteradresse.cs +++ b/BO4E-dotnet/COM/Katasteradresse.cs @@ -1,5 +1,7 @@ using BO4E.meta; + using Newtonsoft.Json; + using ProtoBuf; namespace BO4E.COM @@ -10,13 +12,13 @@ public class Katasteradresse : COM { /// Die Gemarkung oder die Flur in der die Liegenschaft liegt [DataCategory(DataCategory.ADDRESS)] - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "gemarkung_flur", Required = Required.Always)] [ProtoMember(3)] - public string gemarkung_flur; + public string Gemarkung_flur { get; set; } /// Das Flurstück mit dem die Liegenschaft (Grundstück) bezeichnet ist. [DataCategory(DataCategory.ADDRESS)] - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "flurstueck", Required = Required.Always)] [ProtoMember(4)] - public string flurstueck; + public string Flurstueck { get; set; } } } \ No newline at end of file diff --git a/BO4E-dotnet/COM/Konzessionsabgabe.cs b/BO4E-dotnet/COM/Konzessionsabgabe.cs index e84f15d7..239467ac 100644 --- a/BO4E-dotnet/COM/Konzessionsabgabe.cs +++ b/BO4E-dotnet/COM/Konzessionsabgabe.cs @@ -1,5 +1,7 @@ using BO4E.ENUM; + using Newtonsoft.Json; + using ProtoBuf; namespace BO4E.COM @@ -14,22 +16,22 @@ public class Konzessionsabgabe : COM /// /// Art der Abgabe /// - [JsonProperty(Required = Required.Always, Order = 8)] + [JsonProperty(PropertyName = "satz", Required = Required.Always, Order = 8)] [ProtoMember(3)] - public AbgabeArt satz; + public AbgabeArt Satz { get; set; } /// /// Konzessionsabgabe in E/kWh /// - [JsonProperty(Required = Required.Always, Order = 5)] + [JsonProperty(PropertyName = "kosten", Required = Required.Always, Order = 5)] [ProtoMember(4)] - public decimal kosten; + public decimal Kosten { get; set; } /// /// Gebührenkategorie der Konzessionsabgabe /// - [JsonProperty(Required = Required.Always, Order = 6)] + [JsonProperty(PropertyName = "kategorie", Required = Required.Always, Order = 6)] [ProtoMember(5)] - public string kategorie; + public string Kategorie { get; set; } } } diff --git a/BO4E-dotnet/COM/Kostenblock.cs b/BO4E-dotnet/COM/Kostenblock.cs index f2a6ec62..32d118e0 100644 --- a/BO4E-dotnet/COM/Kostenblock.cs +++ b/BO4E-dotnet/COM/Kostenblock.cs @@ -1,5 +1,7 @@ using System.Collections.Generic; + using Newtonsoft.Json; + using ProtoBuf; namespace BO4E.COM @@ -9,16 +11,16 @@ namespace BO4E.COM public class Kostenblock : COM { /// Bezeichnung für einen Kostenblock. Z.B. Netzkosten, Messkosten, Umlagen, etc. - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "kostenblockbezeichnung", Required = Required.Always)] [ProtoMember(3)] - public string kostenblockbezeichnung; + public string Kostenblockbezeichnung { get; set; } /// Die Summe aller Kostenpositionen dieses Blocks - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "summeKostenblock", Required = Required.Default)] [ProtoMember(4)] - public Betrag summeKostenblock; + public Betrag SummeKostenblock { get; set; } /// Hier sind die Details zu einer Kostenposition aufgeführt. Z.B.:Alliander Netz Heinsberg GmbH, 01.02.2018, 31.12.2018, Arbeitspreis HT, 3.660 kWh, 5,8200 ct/kWh, 213,01 €. Details - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "kostenpositionen", Required = Required.Default)] [ProtoMember(5)] - public List kostenpositionen; + public List Kostenpositionen { get; set; } } } \ No newline at end of file diff --git a/BO4E-dotnet/COM/Kostenposition.cs b/BO4E-dotnet/COM/Kostenposition.cs index aed6d861..5f0a0dc5 100644 --- a/BO4E-dotnet/COM/Kostenposition.cs +++ b/BO4E-dotnet/COM/Kostenposition.cs @@ -1,5 +1,7 @@ using System; + using Newtonsoft.Json; + using ProtoBuf; namespace BO4E.COM @@ -9,40 +11,40 @@ namespace BO4E.COM public class Kostenposition : COM { /// Ein Titel für die Zeile. Hier kann z.B. der Netzbetreiber eingetragen werden, wenn es sich um Netzkosten handelt. - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "positionstitel", Required = Required.Always)] [ProtoMember(3)] - public string positionstitel; + public string Positionstitel { get; set; } /// von-Datum der Kostenzeitscheibe. Z.B. 2017-01-01 - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "von", Required = Required.Default)] [ProtoMember(4)] - public DateTime? von; + public DateTime? Von { get; set; } /// bis-Datum der Kostenzeitscheibe. Z.B. 2017-12-31 - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "bis", Required = Required.Default)] [ProtoMember(5)] - public DateTime? bis; + public DateTime? Bis { get; set; } /// Bezeichnung für den Artikel für den die Kosten ermittelt wurden. Beispiel: Arbeitspreis HT - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "artikelbezeichnung", Required = Required.Always)] [ProtoMember(6)] - public string artikelbezeichnung; + public string Artikelbezeichnung { get; set; } /// Detaillierung des Artikels (optional). Beispiel: Drehstromzähler - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "artikeldetail", Required = Required.Default)] [ProtoMember(7)] - public string artikeldetail; - /// Die Menge, die in die Kostenberechnung eingeflossen ist. Beispiel: 3.660 kWh. Details - [JsonProperty(Required = Required.Default)] + public string Artikeldetail { get; set; } + /// Die Menge, die in die Kostenberechnung eingeflossen ist. Beispiel: 3.660 kWh. Details + [JsonProperty(PropertyName = "menge", Required = Required.Default)] [ProtoMember(8)] - public Menge menge; - /// Wenn es einen zeitbasierten Preis gibt (z.B. €/Jahr), dann ist hier die Menge angegeben mit der die Kosten berechnet wurden. Z.B.  138 Tage. Details - [JsonProperty(Required = Required.Default)] + public Menge Menge { get; set; } + /// Wenn es einen zeitbasierten Preis gibt (z.B. €/Jahr), dann ist hier die Menge angegeben mit der die Kosten berechnet wurden. Z.B.  138 Tage. Details + [JsonProperty(PropertyName = "zeitmenge", Required = Required.Default)] [ProtoMember(9)] - public Menge zeitmenge; + public Menge Zeitmenge { get; set; } /// Der Preis für eine Einheit. Beispiele: 5,8200 ct/kWh oder 55 €/Jahr. Details - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "einzelpreis", Required = Required.Always)] [ProtoMember(10)] - public Preis einzelpreis; + public Preis Einzelpreis { get; set; } /// Der errechnete Gesamtbetrag der Position als Ergebnis der Berechnung <Menge> x <Einzelpreis> oder <Einzelpreis> / (Anzahl Tage Jahr) * <zeitmenge>. Details - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "betragKostenposition", Required = Required.Always)] [ProtoMember(11)] - public Betrag betragKostenposition; + public Betrag BetragKostenposition { get; set; } } } \ No newline at end of file diff --git a/BO4E-dotnet/COM/Kriteriumswert.cs b/BO4E-dotnet/COM/Kriteriumswert.cs index cf872a75..de4f5845 100644 --- a/BO4E-dotnet/COM/Kriteriumswert.cs +++ b/BO4E-dotnet/COM/Kriteriumswert.cs @@ -1,5 +1,7 @@ using BO4E.ENUM; + using Newtonsoft.Json; + using ProtoBuf; namespace BO4E.COM @@ -13,15 +15,15 @@ public class KriteriumsWert : COM /// /// Hier steht, für welches Kriterium der Wert gilt. Z.B. Postleitzahlen. /// - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "kriterium", Required = Required.Always)] [ProtoMember(3)] - public Tarifregionskriterium kriterium; + public Tarifregionskriterium Kriterium { get; set; } /// /// Ein Wert, passend zum Kriterium. Z.B. eine Postleitzahl. /// - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "wert", Required = Required.Always)] [ProtoMember(4)] - public string wert; + public string Wert { get; set; } } } diff --git a/BO4E-dotnet/COM/Marktrolle.cs b/BO4E-dotnet/COM/Marktrolle.cs index 440cc9ed..2bb67fcb 100644 --- a/BO4E-dotnet/COM/Marktrolle.cs +++ b/BO4E-dotnet/COM/Marktrolle.cs @@ -1,5 +1,7 @@ using BO4E.meta; + using Newtonsoft.Json; + using ProtoBuf; namespace BO4E.COM @@ -14,23 +16,25 @@ public class Marktrolle : COM /// /// rollencodenummer von Marktrolle /// - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "rollencodenummer", Required = Required.Default)] [ProtoMember(3)] - public string rollencodenummer; + public string Rollencodenummer { get; set; } /// /// code von Marktrolle /// - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "code", Required = Required.Default)] [NonOfficial(NonOfficialCategory.UNSPECIFIED)] [ProtoMember(4)] - public string code; + public string Code { get; set; } /// /// List of Marktrolle. Details siehe /// [JsonProperty(Required = Required.Always)] [ProtoMember(5)] - public ENUM.Marktrolle marktrolle; +#pragma warning disable IDE1006 // Naming Styles because Marktrolle is already the name of the enum + public ENUM.Marktrolle marktrolle { get; set; } +#pragma warning restore IDE1006 // Naming Styles } } diff --git a/BO4E-dotnet/COM/Menge.cs b/BO4E-dotnet/COM/Menge.cs index 9037c1a7..4a8f7899 100644 --- a/BO4E-dotnet/COM/Menge.cs +++ b/BO4E-dotnet/COM/Menge.cs @@ -1,6 +1,8 @@ using BO4E.ENUM; using BO4E.meta; + using Newtonsoft.Json; + using ProtoBuf; namespace BO4E.COM @@ -10,14 +12,14 @@ namespace BO4E.COM public class Menge : COM { /// Gibt den absoluten Wert der Menge an. - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "wert", Required = Required.Always)] [FieldName("value", Language.EN)] [ProtoMember(3)] - public decimal wert; + public decimal Wert { get; set; } /// Gibt die Einheit zum jeweiligen Wert an. Details - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "einheit", Required = Required.Always)] [FieldName("unit", Language.EN)] [ProtoMember(4)] - public Mengeneinheit einheit; + public Mengeneinheit Einheit { get; set; } } } diff --git a/BO4E-dotnet/COM/Messlokationszuordnung.cs b/BO4E-dotnet/COM/Messlokationszuordnung.cs index dee575c5..5e105994 100644 --- a/BO4E-dotnet/COM/Messlokationszuordnung.cs +++ b/BO4E-dotnet/COM/Messlokationszuordnung.cs @@ -1,7 +1,10 @@ using System; + using BO4E.ENUM; using BO4E.meta; + using Newtonsoft.Json; + using ProtoBuf; namespace BO4E.COM @@ -12,20 +15,20 @@ public class Messlokationszuordnung : COM { /// Die Messlokations-ID, früher die Zählpunktbezeichnung. [DataCategory(DataCategory.POD)] - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "messlokationsId", Required = Required.Always)] [ProtoMember(3)] - public string messlokationsId; + public string MesslokationsId { get; set; } /// Die Operation, mit der eine Messung an dieser Lokation für den Gesamtverbrauch der Marktlokation verrechnet wird. Beispielsweise bei einer Untermessung, wird der Verbauch der Untermessung subtrahiert. Details - [JsonProperty(Required = Required.Default)] // Default weil Hochfrequenz/energy-service-hub#35 + [JsonProperty(PropertyName = "arithmetik", Required = Required.Default)] // Default weil Hochfrequenz/energy-service-hub#35 [ProtoMember(4)] - public ArithmetischeOperation? arithmetik; + public ArithmetischeOperation? Arithmetik { get; set; } /// Zeitpunkt, ab dem die Messlokation zur Marktlokation gehört - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "gueltigSeit", Required = Required.Default)] [ProtoMember(5)] - public DateTime? gueltigSeit; + public DateTime? GueltigSeit { get; set; } /// Zeitpunkt, bis zu dem die Messlokation zur Marktlokation gehört - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "gueltigBis", Required = Required.Default)] [ProtoMember(6)] - public DateTime? gueltigBis; + public DateTime? GueltigBis { get; set; } } } \ No newline at end of file diff --git a/BO4E-dotnet/COM/Notiz.cs b/BO4E-dotnet/COM/Notiz.cs index 00c30d40..5bc7d1db 100644 --- a/BO4E-dotnet/COM/Notiz.cs +++ b/BO4E-dotnet/COM/Notiz.cs @@ -1,8 +1,11 @@ using System; using System.Runtime.Serialization; using System.Text.RegularExpressions; + using BO4E.meta; + using Newtonsoft.Json; + using ProtoBuf; namespace BO4E.COM @@ -18,23 +21,23 @@ public class Notiz : COM /// /// Person oder System, das die Notiz angelegt hat. /// - [JsonProperty(Required = Required.Always, Order = 7)] + [JsonProperty(PropertyName = "autor", Required = Required.Always, Order = 7)] [ProtoMember(3)] - public string autor; + public string Autor { get; set; } /// /// Zeitpunkt zu dem die Notiz angelegt wurde /// - [JsonProperty(Required = Required.Always, Order = 8)] + [JsonProperty(PropertyName = "zeitpunkt", Required = Required.Always, Order = 8)] [ProtoMember(4)] - public DateTime zeitpunkt; + public DateTime Zeitpunkt { get; set; } /// /// Inhalt der Notiz (Freitext) /// - [JsonProperty(Required = Required.Always, Order = 5)] + [JsonProperty(PropertyName = "inhalt", Required = Required.Always, Order = 5)] [ProtoMember(5)] - public string inhalt; + public string Inhalt { get; set; } [JsonIgnore] @@ -47,7 +50,7 @@ public class Notiz : COM [OnDeserialized] public void CleanUpSapNotes(StreamingContext context) { - this.inhalt = TrailingMinusRegex.Replace(inhalt, string.Empty); + this.Inhalt = TrailingMinusRegex.Replace(Inhalt, string.Empty); } } } diff --git a/BO4E-dotnet/COM/PhysikalischerWert.cs b/BO4E-dotnet/COM/PhysikalischerWert.cs index 92dc82cb..6ab65766 100644 --- a/BO4E-dotnet/COM/PhysikalischerWert.cs +++ b/BO4E-dotnet/COM/PhysikalischerWert.cs @@ -1,6 +1,10 @@ using System; + using BO4E.ENUM; using BO4E.meta; + +using Newtonsoft.Json; + using ProtoBuf; namespace BO4E.COM @@ -16,13 +20,15 @@ public class PhysikalischerWert : COM /// numerischer Wert /// [ProtoMember(3)] - public readonly decimal wert; + [JsonProperty(Required = Required.Always, PropertyName = "wert")] + public decimal Wert { get; set; } /// - /// Einheit von + /// Einheit von /// [ProtoMember(4)] - public readonly Mengeneinheit einheit; + [JsonProperty(Required=Required.Always, PropertyName = "einheit")] + public Mengeneinheit Einheit { get; set; } /// /// initialise with wert and einheit @@ -31,8 +37,8 @@ public class PhysikalischerWert : COM /// zugehörige Mengeneinheit public PhysikalischerWert(decimal wert, Mengeneinheit einheit) { - this.wert = wert; - this.einheit = einheit; + this.Wert = wert; + this.Einheit = einheit; } /// @@ -42,11 +48,16 @@ public PhysikalischerWert(decimal wert, Mengeneinheit einheit) /// zugehörige Einheit als string (case insensitive) public PhysikalischerWert(decimal wert, string einheitString) { - this.wert = wert; - if(!Enum.TryParse(einheitString, true, out this.einheit)) + this.Wert = wert; + + if (!Enum.TryParse(einheitString, true, out Mengeneinheit einheit)) { throw new ArgumentException($"'{einheitString}' is not a valid Mengeneinheit"); } + else + { + this.Einheit = einheit; + } } } } diff --git a/BO4E-dotnet/COM/PositionsAufAbschlag.cs b/BO4E-dotnet/COM/PositionsAufAbschlag.cs index be2a765b..ee757c7f 100644 --- a/BO4E-dotnet/COM/PositionsAufAbschlag.cs +++ b/BO4E-dotnet/COM/PositionsAufAbschlag.cs @@ -1,5 +1,7 @@ using BO4E.ENUM; + using Newtonsoft.Json; + using ProtoBuf; namespace BO4E.COM @@ -9,24 +11,24 @@ namespace BO4E.COM public class PositionsAufAbschlag : COM { /// Bezeichnung des Auf-/Abschlags - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "bezeichnung", Required = Required.Always)] [ProtoMember(3)] - public string bezeichnung; + public string Bezeichnung { get; set; } /// Beschreibung zum Auf-/Abschlag - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "beschreibung", Required = Required.Always)] [ProtoMember(4)] - public string beschreibung; - /// Typ des AufAbschlages. Details - [JsonProperty(Required = Required.Always)] + public string Beschreibung { get; set; } + /// Typ des AufAbschlages. Details + [JsonProperty(PropertyName = "aufAbschlagstyp", Required = Required.Always)] [ProtoMember(5)] - public AufAbschlagstyp aufAbschlagstyp; + public AufAbschlagstyp AufAbschlagstyp { get; set; } /// Höhe des Auf-/Abschlages - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "aufAbschlagswert", Required = Required.Always)] [ProtoMember(6)] - public decimal aufAbschlagswert; + public decimal AufAbschlagswert { get; set; } /// Einheit, in der der Auf-/Abschlag angegeben ist (z.B. ct/kWh). Details - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "aufAbschlagswaehrung", Required = Required.Always)] [ProtoMember(7)] - public Waehrungseinheit aufAbschlagswaehrung; + public Waehrungseinheit AufAbschlagswaehrung { get; set; } } } \ No newline at end of file diff --git a/BO4E-dotnet/COM/Preis.cs b/BO4E-dotnet/COM/Preis.cs index f49ac5ae..1714831d 100644 --- a/BO4E-dotnet/COM/Preis.cs +++ b/BO4E-dotnet/COM/Preis.cs @@ -1,6 +1,8 @@ using BO4E.ENUM; using BO4E.meta; + using Newtonsoft.Json; + using ProtoBuf; namespace BO4E.COM @@ -10,26 +12,26 @@ namespace BO4E.COM public class Preis : COM { /// Gibt die nomiale Höhe des Preises an. - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "wert", Required = Required.Always)] [FieldName("value", Language.EN)] [ProtoMember(3)] - public decimal wert; + public decimal Wert { get; set; } /// Währungseinheit für den Preis, z.B. Euro oder Ct. Details - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "einheit", Required = Required.Always)] [FieldName("currency", Language.EN)] [ProtoMember(4)] - public Waehrungseinheit einheit; + public Waehrungseinheit Einheit { get; set; } /// Angabe, für welche Bezugsgröße der Preis gilt. Z.B. kWh. - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "bezugswert", Required = Required.Always)] [FieldName("reference", Language.EN)] [ProtoMember(5)] - public Mengeneinheit bezugswert; + public Mengeneinheit Bezugswert { get; set; } /// /// Gibt den Status des veröffentlichten Preises an /// - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "status", Required = Required.Default)] [ProtoMember(6)] - public Preisstatus? status; + public Preisstatus? Status { get; set; } } } \ No newline at end of file diff --git a/BO4E-dotnet/COM/Preisgarantie.cs b/BO4E-dotnet/COM/Preisgarantie.cs index 01d90880..e5c1bb4b 100644 --- a/BO4E-dotnet/COM/Preisgarantie.cs +++ b/BO4E-dotnet/COM/Preisgarantie.cs @@ -1,5 +1,7 @@ using BO4E.ENUM; + using Newtonsoft.Json; + using ProtoBuf; namespace BO4E.COM @@ -12,16 +14,16 @@ namespace BO4E.COM public class Preisgarantie : COM { /// Freitext zur Beschreibung der Preisgarantie - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "beschreibung", Required = Required.Default)] [ProtoMember(3)] - public string beschreibung; - /// Festlegung, auf welche Preisbestandteile die Garantie gewährt wird. Details - [JsonProperty(Required = Required.Always)] + public string Beschreibung { get; set; } + /// Festlegung, auf welche Preisbestandteile die Garantie gewährt wird. Details + [JsonProperty(PropertyName = "preisgarantietyp", Required = Required.Always)] [ProtoMember(4)] - public Preisgarantietyp preisgarantietyp; + public Preisgarantietyp Preisgarantietyp { get; set; } /// Zeitraum, bis zu dem die Preisgarantie gilt, z.B. bis zu einem absolutem / fixem Datum oder als Laufzeit in Monaten. Details - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "zeitlicheGueltigkeit", Required = Required.Always)] [ProtoMember(5)] - public Zeitraum zeitlicheGueltigkeit; + public Zeitraum ZeitlicheGueltigkeit { get; set; } } } \ No newline at end of file diff --git a/BO4E-dotnet/COM/Preisposition.cs b/BO4E-dotnet/COM/Preisposition.cs index 56664545..c1c50d2f 100644 --- a/BO4E-dotnet/COM/Preisposition.cs +++ b/BO4E-dotnet/COM/Preisposition.cs @@ -1,6 +1,9 @@ using System.Collections.Generic; + using BO4E.ENUM; + using Newtonsoft.Json; + using ProtoBuf; namespace BO4E.COM @@ -10,48 +13,48 @@ namespace BO4E.COM public class Preisposition : COM { /// Das Modell, das der Preisbildung zugrunde liegt. Details - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "berechnungsmethode", Required = Required.Always)] [ProtoMember(3)] - public Kalkulationsmethode berechnungsmethode; - /// Standardisierte Bezeichnung für die abgerechnete Leistungserbringung. Details - [JsonProperty(Required = Required.Always)] + public Kalkulationsmethode Berechnungsmethode { get; set; } + /// Standardisierte Bezeichnung für die abgerechnete Leistungserbringung. Details + [JsonProperty(PropertyName = "leistungstyp", Required = Required.Always)] [ProtoMember(4)] - public Leistungstyp leistungstyp; + public Leistungstyp Leistungstyp { get; set; } /// Bezeichnung für die in der Position abgebildete Leistungserbringung - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "leistungsbezeichung", Required = Required.Always)] [ProtoMember(5)] - public string leistungsbezeichung; + public string Leistungsbezeichung { get; set; } /// Festlegung, mit welcher Preiseinheit abgerechnet wird, z.B. Ct. oder €. Details - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "preiseinheit", Required = Required.Always)] [ProtoMember(6)] - public Waehrungseinheit preiseinheit; + public Waehrungseinheit Preiseinheit { get; set; } /// Hier wird festgelegt, auf welche Bezugsgröße sich der Preis bezieht, z.B. kWh oder Stück. Details - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "bezugsgroesse", Required = Required.Always)] [ProtoMember(7)] - public Mengeneinheit bezugsgroesse; + public Mengeneinheit Bezugsgroesse { get; set; } /// Die Zeit(dauer) auf die sich der Preis bezieht. Z.B. ein Jahr für einen Leistungspreis der in €/kW/Jahr ausgegeben wird. - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "zeitbasis", Required = Required.Default)] [ProtoMember(8)] - public Zeiteinheit? zeitbasis; - /// Festlegung, für welche Tarifzeit der Preis hier festgelegt ist. - [JsonProperty(Required = Required.Default)] + public Zeiteinheit? Zeitbasis { get; set; } + /// Festlegung, für welche Tarifzeit der Preis hier festgelegt ist. + [JsonProperty(PropertyName = "tarifzeit", Required = Required.Default)] [ProtoMember(9)] - public Tarifzeit? tarifzeit; + public Tarifzeit? Tarifzeit { get; set; } /// Eine vom BDEW standardisierte Bezeichnung für die abgerechnete Leistungserbringung. Diese Artikelnummer wird auch im Rechnungsteil der INVOIC verwendet. - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "bdewArtikelnummer", Required = Required.Default)] [ProtoMember(10)] - public BDEWArtikelnummer? bdewArtikelnummer; + public BDEWArtikelnummer? BdewArtikelnummer { get; set; } /// Mit der Menge der hier angegebenen Größe wird die Staffelung/Zonung durchgeführt. Z.B. Vollbenutzungsstunden. - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "zonungsgroesse", Required = Required.Default)] [ProtoMember(11)] - public Bemessungsgroesse? zonungsgroesse; + public Bemessungsgroesse? Zonungsgroesse { get; set; } /// Zuschläge oder Abschläge auf die Position. - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "zu_abschlaege", Required = Required.Default)] [ProtoMember(12)] - public PositionsAufAbschlag zu_abschlaege; + public PositionsAufAbschlag Zu_abschlaege { get; set; } /// Preisstaffeln, die zu dieser Preisposition gehören. Details - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "preisstaffeln", Required = Required.Always)] [ProtoMember(13)] - public List preisstaffeln; + public List Preisstaffeln { get; set; } } } \ No newline at end of file diff --git a/BO4E-dotnet/COM/Preisstaffel.cs b/BO4E-dotnet/COM/Preisstaffel.cs index ad410812..1ef8dc30 100644 --- a/BO4E-dotnet/COM/Preisstaffel.cs +++ b/BO4E-dotnet/COM/Preisstaffel.cs @@ -1,4 +1,5 @@ using Newtonsoft.Json; + using ProtoBuf; namespace BO4E.COM @@ -9,20 +10,20 @@ namespace BO4E.COM public class Preisstaffel : COM { /// Preis pro abgerechneter Mengeneinheit - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "einheitspreis", Required = Required.Always)] [ProtoMember(3)] - public decimal einheitspreis; + public decimal Einheitspreis { get; set; } /// Unterer Wert, ab dem die Staffel gilt. - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "staffelgrenzeVon", Required = Required.Always)] [ProtoMember(4)] - public decimal staffelgrenzeVon; + public decimal StaffelgrenzeVon { get; set; } /// Oberer Wert, bis zu dem die Staffel gilt. - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "staffelgrenzeBis", Required = Required.Always)] [ProtoMember(5)] - public decimal staffelgrenzeBis; - /// Parameter zur Berechnung des Preises anhand der Jahresmenge und weiterer netzbezogener Parameter. - [JsonProperty(Required = Required.Default)] + public decimal StaffelgrenzeBis { get; set; } + /// Parameter zur Berechnung des Preises anhand der Jahresmenge und weiterer netzbezogener Parameter. + [JsonProperty(PropertyName = "sigmoidparameter", Required = Required.Default)] [ProtoMember(6)] - public Sigmoidparameter sigmoidparameter; + public Sigmoidparameter Sigmoidparameter { get; set; } } } \ No newline at end of file diff --git a/BO4E-dotnet/COM/Rechnungsposition.cs b/BO4E-dotnet/COM/Rechnungsposition.cs index 3cf15502..f08364ca 100644 --- a/BO4E-dotnet/COM/Rechnungsposition.cs +++ b/BO4E-dotnet/COM/Rechnungsposition.cs @@ -1,7 +1,10 @@ using System; + using BO4E.ENUM; using BO4E.meta; + using Newtonsoft.Json; + using ProtoBuf; namespace BO4E.COM @@ -11,106 +14,106 @@ namespace BO4E.COM public class Rechnungsposition : COM { /// Fortlaufende Nummer für die Rechnungsposition. - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "positionsnummer", Required = Required.Always)] [FieldName("invoiceItemNumber", Language.EN)] [ProtoMember(3)] - public int positionsnummer; + public int Positionsnummer { get; set; } /// Start der Lieferung für die abgerechnete Leistung. - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "lieferungVon", Required = Required.Always)] [FieldName("deliveryStart", Language.EN)] [ProtoMember(4)] - public DateTime lieferungVon; + public DateTime LieferungVon { get; set; } /// Ende der Lieferung für die abgerechnete Leistung. - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "lieferungBis", Required = Required.Always)] [FieldName("deliveryEnd", Language.EN)] [ProtoMember(5)] - public DateTime lieferungBis; + public DateTime LieferungBis { get; set; } /// Bezeichnung für die abgerechnete Position. - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "positionstext", Required = Required.Always)] [FieldName("invoiceItemText", Language.EN)] [ProtoMember(6)] - public string positionstext; + public string Positionstext { get; set; } /// Falls sich der Preis auf eine Zeit bezieht, steht hier die Einheit, z.B. JAHR. Details - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "zeiteinheit", Required = Required.Default)] [FieldName("unit", Language.EN)] - [ProtoMember(7)] public Mengeneinheit? zeiteinheit; + [ProtoMember(7)] public Mengeneinheit? Zeiteinheit { get; set; } /// Kennzeichnung der Rechnungsposition mit der Standard-Artikelnummer des BDEW. Details - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "artikelnummer", Required = Required.Default)] [ProtoMember(8)] - public BDEWArtikelnummer? artikelnummer; + public BDEWArtikelnummer? Artikelnummer { get; set; } /// Marktlokation, die zu dieser Position gehört. - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "lokationsId", Required = Required.Default)] [ProtoMember(9)] - public string lokationsId; + public string LokationsId { get; set; } /// Die abgerechnete Menge mit Einheit. Z.B. 4372 kWh. Details - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "positionsMenge", Required = Required.Default)] [FieldName("amount", Language.EN)] [ProtoMember(10)] - public Menge positionsMenge; + public Menge PositionsMenge { get; set; } /// Eine auf die Zeiteinheit bezogene Untermenge. Z.B. bei einem Jahrespreis, 3 Monate oder 146 Tage. Basierend darauf wird der Preis aufgeteilt. Details - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "zeitbezogeneMenge", Required = Required.Default)] [FieldName("timeBasedAmount", Language.EN)] [ProtoMember(11)] - public Menge zeitbezogeneMenge; + public Menge ZeitbezogeneMenge { get; set; } /// Der Preis für eine Einheit der energetischen Menge. Details - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "einzelpreis", Required = Required.Always)] [FieldName("unitCost", Language.EN)] [ProtoMember(12)] - public Preis einzelpreis; + public Preis Einzelpreis { get; set; } /// Das Ergebnis der Multiplikation aus einzelpreis * positionsMenge * (Faktor aus zeitbezogeneMenge). Z.B. 12,60€ * 120 kW * 3/12 (für 3 Monate). Details - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "teilsummeNetto", Required = Required.Default)] [FieldName("subtotalNet", Language.EN)] [ProtoMember(13)] - public Betrag teilsummeNetto; + public Betrag TeilsummeNetto { get; set; } /// Nettobetrag für den Rabatt dieser Position. Details - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "teilrabattNetto", Required = Required.Default)] [FieldName("someDiscountNet", Language.EN)] [ProtoMember(14)] - public Betrag teilrabattNetto; + public Betrag TeilrabattNetto { get; set; } /// Auf die Position entfallende Steuer, bestehend aus Steuersatz und Betrag. Details - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "teilsummeSteuer", Required = Required.Default)] [FieldName("subtotalTax", Language.EN)] [ProtoMember(15)] - public Steuerbetrag teilsummeSteuer; + public Steuerbetrag TeilsummeSteuer { get; set; } /// /// Möglichkeit die Rechnungsposition einem Vertragskonto zuzuordnen, um die Rechnungsposition mittels SAP Convergent Invoicing zu verarbeiten. /// (Ergänzung von Hochfrequenz Unternehmensberatung GmbH) /// - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "vertragskontoId", Required = Required.Default)] [Obsolete("Please use vertragsId instead of vertragskontoId", false)] [FieldName("contractAccountId", Language.EN)] [ProtoMember(16)] - public string vertragskontoId; + public string VertragskontoId { get; set; } /// /// Möglichkeit die Rechnungsposition einem Vertragskonto zuzuordnen, um die Rechnungsposition mittels SAP Convergent Invoicing zu verarbeiten. /// (Ergänzung von Hochfrequenz Unternehmensberatung GmbH) /// - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "vertragsId", Required = Required.Default)] [ProtoMember(1017)] [NonOfficial(NonOfficialCategory.CUSTOMER_REQUIREMENTS)] - public string vertragsId; + public string VertragsId { get; set; } /// /// status einer Rechnungsposition in SAP Convergent Invoicing /// (Ergänzung von Hochfrequenz Unternehmensberatung GmbH) /// - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "status", Required = Required.Default)] [NonOfficial(NonOfficialCategory.CUSTOMER_REQUIREMENTS)] [ProtoMember(1018)] - public RechnungspositionsStatus? status; + public RechnungspositionsStatus? Status { get; set; } } } \ No newline at end of file diff --git a/BO4E-dotnet/COM/RechnungspositionFlat.cs b/BO4E-dotnet/COM/RechnungspositionFlat.cs index e46dceef..27044273 100644 --- a/BO4E-dotnet/COM/RechnungspositionFlat.cs +++ b/BO4E-dotnet/COM/RechnungspositionFlat.cs @@ -1,7 +1,10 @@ using System; + using BO4E.ENUM; using BO4E.meta; + using Newtonsoft.Json; + using ProtoBuf; namespace BO4E.COM @@ -15,96 +18,96 @@ namespace BO4E.COM [NonOfficial(NonOfficialCategory.CUSTOMER_REQUIREMENTS)] public class RechnungspositionFlat : COM { - /// - [JsonProperty(Required = Required.Always)] + /// + [JsonProperty(PropertyName = "positionsnummer", Required = Required.Always)] [ProtoMember(3)] - public int positionsnummer; + public int Positionsnummer { get; set; } - /// - [JsonProperty(Required = Required.Always)] + /// + [JsonProperty(PropertyName = "lieferungVon", Required = Required.Always)] [ProtoMember(4)] - public DateTime lieferungVon; + public DateTime LieferungVon { get; set; } - /// - [JsonProperty(Required = Required.Always)] + /// + [JsonProperty(PropertyName = "lieferungBis", Required = Required.Always)] [ProtoMember(5)] - public DateTime lieferungBis; + public DateTime LieferungBis { get; set; } /// /// Der Positionstext entspricht dem SAP CI Teilprozess bzw. der GCN Categoy - /// + /// /// - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "positionstext", Required = Required.Always)] [ProtoMember(6)] - public string positionstext; + public string Positionstext { get; set; } - /// > - [JsonProperty(Required = Required.Always)] + /// > + [JsonProperty(PropertyName = "lokationsId", Required = Required.Always)] [ProtoMember(7)] - public string lokationsId; + public string LokationsId { get; set; } - /// > - [JsonProperty(Required = Required.Always)] + /// > + [JsonProperty(PropertyName = "vertragskontoId", Required = Required.Always)] [ProtoMember(8)] - public string vertragskontoId; + public string VertragskontoId { get; set; } /// - /// and + /// and /// - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "preisWert", Required = Required.Always)] [ProtoMember(9)] - public decimal preisWert; + public decimal PreisWert { get; set; } /// - /// and + /// and /// - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "preisEinheit", Required = Required.Always)] [ProtoMember(10)] - public Waehrungseinheit preisEinheit; + public Waehrungseinheit PreisEinheit { get; set; } /// - /// and + /// and /// - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "preisBezugswert", Required = Required.Always)] [ProtoMember(11)] - public Mengeneinheit preisBezugswert; + public Mengeneinheit PreisBezugswert { get; set; } /// - /// and + /// and /// - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "preisStatus", Required = Required.Default)] [ProtoMember(12)] - public Preisstatus? preisStatus; + public Preisstatus? PreisStatus { get; set; } /// /// GCN mediated value value - /// and + /// and /// - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "positionsMengeWert", Required = Required.Always)] [ProtoMember(13)] - public decimal? positionsMengeWert; + public decimal? PositionsMengeWert { get; set; } /// /// GCN mediated value unit - /// and + /// and /// - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "positionsMengeEinheit", Required = Required.Always)] [ProtoMember(14)] - public Mengeneinheit? positionsMengeEinheit; + public Mengeneinheit? PositionsMengeEinheit { get; set; } - /// - [JsonProperty(Required = Required.Default)] + /// + [JsonProperty(PropertyName = "vertragsId", Required = Required.Default)] [ProtoMember(15)] - public string vertragsId; + public string VertragsId { get; set; } /// /// status einer Rechnungsposition in SAP Convergent Invoicing /// (Ergänzung von Hochfrequenz Unternehmensberatung GmbH) /// - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "status", Required = Required.Default)] [ProtoMember(16)] - public RechnungspositionsStatus? status; + public RechnungspositionsStatus? Status { get; set; } /// /// Kind of a copy constructor that moves data from a @@ -114,32 +117,32 @@ public class RechnungspositionFlat : COM public RechnungspositionFlat(Rechnungsposition rp) { // todo: make this reflection based. this is pita. - this.positionsnummer = rp.positionsnummer; - this.lieferungVon = rp.lieferungVon; - this.lieferungBis = rp.lieferungBis; - this.positionstext = rp.positionstext; - this.lokationsId = rp.lokationsId; - this.vertragsId = rp.vertragsId; - this.vertragskontoId = rp.vertragskontoId; - if (rp.einzelpreis != null) + this.Positionsnummer = rp.Positionsnummer; + this.LieferungVon = rp.LieferungVon; + this.LieferungBis = rp.LieferungBis; + this.Positionstext = rp.Positionstext; + this.LokationsId = rp.LokationsId; + this.VertragsId = rp.VertragsId; + this.VertragskontoId = rp.VertragskontoId; + if (rp.Einzelpreis != null) { - this.preisWert = rp.einzelpreis.wert; - this.preisEinheit = rp.einzelpreis.einheit; - this.preisBezugswert = rp.einzelpreis.bezugswert; - this.preisStatus = rp.einzelpreis.status; + this.PreisWert = rp.Einzelpreis.Wert; + this.PreisEinheit = rp.Einzelpreis.Einheit; + this.PreisBezugswert = rp.Einzelpreis.Bezugswert; + this.PreisStatus = rp.Einzelpreis.Status; } - if (rp.positionsMenge != null) + if (rp.PositionsMenge != null) { - this.positionsMengeEinheit = rp.positionsMenge.einheit; - this.positionsMengeWert = rp.positionsMenge.wert; + this.PositionsMengeEinheit = rp.PositionsMenge.Einheit; + this.PositionsMengeWert = rp.PositionsMenge.Wert; } else { - this.positionsMengeEinheit = null; - this.positionsMengeWert = null; + this.PositionsMengeEinheit = null; + this.PositionsMengeWert = null; } - this.guid = rp.guid; - this.status = rp.status; + this.Guid = rp.Guid; + this.Status = rp.Status; } /// @@ -151,27 +154,27 @@ public Rechnungsposition ToRechnungsposition() // todo: make this reflection based. this is pure pita. in fact the whole process of the flat structure is pita for sap Rechnungsposition result = new Rechnungsposition() { - positionsnummer = positionsnummer, - lieferungVon = lieferungVon, - lieferungBis = lieferungBis, - positionstext = positionstext, - lokationsId = lokationsId, - vertragsId = vertragsId, - vertragskontoId = vertragskontoId, - einzelpreis = new Preis() + Positionsnummer = Positionsnummer, + LieferungVon = LieferungVon, + LieferungBis = LieferungBis, + Positionstext = Positionstext, + LokationsId = LokationsId, + VertragsId = VertragsId, + VertragskontoId = VertragskontoId, + Einzelpreis = new Preis() { - wert = preisWert, - einheit = preisEinheit, - bezugswert = preisBezugswert, - status = preisStatus ?? Preisstatus.VORLAEUFIG // poor default choice + Wert = PreisWert, + Einheit = PreisEinheit, + Bezugswert = PreisBezugswert, + Status = PreisStatus ?? Preisstatus.VORLAEUFIG // poor default choice }, - positionsMenge = new Menge() + PositionsMenge = new Menge() { - einheit = positionsMengeEinheit ?? Mengeneinheit.KWH, // poor default choice - wert = positionsMengeWert ?? 0.0M, // poor default choice + Einheit = PositionsMengeEinheit ?? Mengeneinheit.KWH, // poor default choice + Wert = PositionsMengeWert ?? 0.0M, // poor default choice }, - guid = guid, - status = status + Guid = Guid, + Status = Status }; return result; } diff --git a/BO4E-dotnet/COM/RegionaleGueltigkeit.cs b/BO4E-dotnet/COM/RegionaleGueltigkeit.cs index 5cfff37b..f615823b 100644 --- a/BO4E-dotnet/COM/RegionaleGueltigkeit.cs +++ b/BO4E-dotnet/COM/RegionaleGueltigkeit.cs @@ -1,6 +1,9 @@ using System.Collections.Generic; + using BO4E.ENUM; + using Newtonsoft.Json; + using ProtoBuf; namespace BO4E.COM @@ -9,13 +12,13 @@ namespace BO4E.COM [ProtoContract] public class RegionaleGueltigkeit : COM { - /// Unterscheidung ob Positivliste oder Negativliste übertragen wird. Details - [JsonProperty(Required = Required.Always)] + /// Unterscheidung ob Positivliste oder Negativliste übertragen wird. Details + [JsonProperty(PropertyName = "gueltigkeitstyp", Required = Required.Always)] [ProtoMember(3)] - public Gueltigkeitstyp gueltigkeitstyp; + public Gueltigkeitstyp Gueltigkeitstyp { get; set; } /// Hier steht, für welches Kriterium die Liste gilt. Z.B. Postleitzahlen. Details - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "kriteriumsWerte", Required = Required.Always)] [ProtoMember(4)] - public List kriteriumsWerte; + public List KriteriumsWerte { get; set; } } } \ No newline at end of file diff --git a/BO4E-dotnet/COM/RegionalePreisgarantie.cs b/BO4E-dotnet/COM/RegionalePreisgarantie.cs index ef25538e..0b9a7295 100644 --- a/BO4E-dotnet/COM/RegionalePreisgarantie.cs +++ b/BO4E-dotnet/COM/RegionalePreisgarantie.cs @@ -1,15 +1,14 @@ -using Newtonsoft.Json; -using ProtoBuf; +using Newtonsoft.Json; -namespace BO4E.COM -{ - /// Abbildung einer Preisgarantie mit regionaler Abgrenzung. - //[ProtoContract] - public class RegionalePreisgarantie : Preisgarantie - { - /// Regionale Eingrenzung der Preisgarantie. Details - [JsonProperty(Required = Required.Always)] - //[ProtoMember(6)] - public RegionaleGueltigkeit regionaleGueltigkeit; - } +namespace BO4E.COM +{ + /// Abbildung einer Preisgarantie mit regionaler Abgrenzung. + //[ProtoContract] + public class RegionalePreisgarantie : Preisgarantie + { + /// Regionale Eingrenzung der Preisgarantie. Details + [JsonProperty(PropertyName = "regionaleGueltigkeit", Required = Required.Always)] + //[ProtoMember(6)] + public RegionaleGueltigkeit RegionaleGueltigkeit { get; set; } + } } \ No newline at end of file diff --git a/BO4E-dotnet/COM/RegionalePreisstaffel.cs b/BO4E-dotnet/COM/RegionalePreisstaffel.cs index 05a8a34c..a632e92f 100644 --- a/BO4E-dotnet/COM/RegionalePreisstaffel.cs +++ b/BO4E-dotnet/COM/RegionalePreisstaffel.cs @@ -1,5 +1,4 @@ using Newtonsoft.Json; -using ProtoBuf; namespace BO4E.COM { @@ -7,9 +6,9 @@ namespace BO4E.COM //[ProtoContract] public class RegionalePreisstaffel : Preisstaffel { - /// Regionale Eingrenzung der Preisstaffel. Details - [JsonProperty(Required = Required.Always)] + /// Regionale Eingrenzung der Preisstaffel. Details + [JsonProperty(PropertyName = "regionaleGueltigkeit", Required = Required.Always)] //[ProtoMember(8)] - public RegionaleGueltigkeit regionaleGueltigkeit; + public RegionaleGueltigkeit RegionaleGueltigkeit { get; set; } } } \ No newline at end of file diff --git a/BO4E-dotnet/COM/RegionaleTarifpreisposition.cs b/BO4E-dotnet/COM/RegionaleTarifpreisposition.cs index ad821d1e..8ab7b0bd 100644 --- a/BO4E-dotnet/COM/RegionaleTarifpreisposition.cs +++ b/BO4E-dotnet/COM/RegionaleTarifpreisposition.cs @@ -1,6 +1,9 @@ using System.Collections.Generic; + using BO4E.ENUM; + using Newtonsoft.Json; + using ProtoBuf; namespace BO4E.COM @@ -9,25 +12,25 @@ namespace BO4E.COM [ProtoContract] public class RegionaleTarifpreisposition : COM { - /// Angabe des Preistyps (z.B. Grundpreis) Details - [JsonProperty(Required = Required.Always)] + /// Angabe des Preistyps (z.B. Grundpreis) Details + [JsonProperty(PropertyName = "preistyp", Required = Required.Always)] [ProtoMember(3)] - public Preistyp preistyp; + public Preistyp Preistyp { get; set; } /// Einheit des Preises (z.B. EURO) Details - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "einheit", Required = Required.Always)] [ProtoMember(4)] - public string einheit; + public string Einheit { get; set; } /// Größe, auf die sich die Einheit bezieht, beispielsweise kWh, Jahr. Details - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "bezugseinheit", Required = Required.Always)] [ProtoMember(5)] - public Mengeneinheit bezugseinheit; + public Mengeneinheit Bezugseinheit { get; set; } /// Gibt an, nach welcher Menge die vorgenannte Einschränkung erfolgt (z.B. Jahresstromverbrauch in kWh).Details - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "mengeneinheitstaffel", Required = Required.Default)] [ProtoMember(6)] - public Mengeneinheit? mengeneinheitstaffel; + public Mengeneinheit? Mengeneinheitstaffel { get; set; } /// Hier sind die Staffeln mit ihren Preisangaben und regionalen Gültigkeiten definiert. Struktur - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "preisstaffeln", Required = Required.Default)] [ProtoMember(7)] - public List preisstaffeln; + public List Preisstaffeln { get; set; } } } \ No newline at end of file diff --git a/BO4E-dotnet/COM/RegionalerAufAbschlag.cs b/BO4E-dotnet/COM/RegionalerAufAbschlag.cs index 8b1177a6..7b1f1dbd 100644 --- a/BO4E-dotnet/COM/RegionalerAufAbschlag.cs +++ b/BO4E-dotnet/COM/RegionalerAufAbschlag.cs @@ -1,6 +1,9 @@ using System.Collections.Generic; + using BO4E.ENUM; + using Newtonsoft.Json; + using ProtoBuf; namespace BO4E.COM @@ -11,78 +14,78 @@ namespace BO4E.COM public class RegionalerAufAbschlag : COM { /// Bezeichnung des Auf-/Abschlags - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "bezeichnung", Required = Required.Always)] [ProtoMember(3)] - public string bezeichnung; + public string Bezeichnung { get; set; } /// Beschreibung zum Auf-/Abschlag - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "beschreibung", Required = Required.Default)] [ProtoMember(4)] - public string beschreibung; + public string Beschreibung { get; set; } - /// Typ des Aufabschlages (z.B. absolut oder prozentual). Details - [JsonProperty(Required = Required.Default)] + /// Typ des Aufabschlages (z.B. absolut oder prozentual). Details + [JsonProperty(PropertyName = "aufAbschlagstyp", Required = Required.Default)] [ProtoMember(5)] - public AufAbschlagstyp? aufAbschlagstyp; + public AufAbschlagstyp? AufAbschlagstyp { get; set; } - /// Diesem Preis oder den Kosten ist der Auf/Abschlag zugeordnet. Z.B. Arbeitspreis, Gesamtpreis etc.. Details - [JsonProperty(Required = Required.Default)] + /// Diesem Preis oder den Kosten ist der Auf/Abschlag zugeordnet. Z.B. Arbeitspreis, Gesamtpreis etc.. Details + [JsonProperty(PropertyName = "aufAbschlagsziel", Required = Required.Default)] [ProtoMember(6)] - public AufAbschlagsziel? aufAbschlagsziel; + public AufAbschlagsziel? AufAbschlagsziel { get; set; } /// Gibt an in welcher Währungseinheit der Auf/Abschlag berechnet wird. Euro oder Ct.. (Nur im Falle absoluter Aufschlagstypen). Details - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "einheit", Required = Required.Default)] [ProtoMember(7)] - public Waehrungseinheit? einheit; + public Waehrungseinheit? Einheit { get; set; } /// Internetseite, auf der die Informationen zum Auf-/Abschlag veröffentlicht sind. - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "website", Required = Required.Default)] [ProtoMember(8)] - public string website; + public string Website { get; set; } /// Zusatzprodukte, die nur in Kombination mit diesem AufAbschlag erhältlich sind. - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "zusatzprodukte", Required = Required.Default)] [ProtoMember(9)] - public List zusatzprodukte; + public List Zusatzprodukte { get; set; } /// Voraussetzungen, die erfüllt sein müssen, damit dieser AufAbschlag zur Anwendung kommen kann - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "voraussetzungen", Required = Required.Default)] [ProtoMember(10)] - public List voraussetzungen; + public List Voraussetzungen { get; set; } /// Zeitraum, in dem der Abschlag zur Anwendung kommen kann. Details - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "gueltigkeitszeitraum", Required = Required.Default)] [ProtoMember(11)] - public Zeitraum gueltigkeitszeitraum; + public Zeitraum Gueltigkeitszeitraum { get; set; } /// Durch die Anwendung des Auf/Abschlags kann eine Änderung des Tarifnamens auftreten. - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "tarifnamensaenderungen", Required = Required.Default)] [ProtoMember(12)] - public string tarifnamensaenderungen; + public string Tarifnamensaenderungen { get; set; } /// Der Energiemix kann sich durch einen AufAbschlag ändern (z.B. zwei Cent Aufschlag für Ökostrom: Sollte dies der Fall sein,wird hier die neue Zusammensetzung des Energiemix angegeben. Details - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "energiemixaenderung", Required = Required.Default)] [ProtoMember(13)] - public Energiemix energiemixaenderung; + public Energiemix Energiemixaenderung { get; set; } /// Änderungen in den Vertragskonditionen. Falls in dieser Komponenten angegeben, werden die Tarifparameter hiermit überschrieben. Details - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "vertagskonditionsaenderung", Required = Required.Default)] [ProtoMember(14)] - public Vertragskonditionen vertagskonditionsaenderung; + public Vertragskonditionen Vertagskonditionsaenderung { get; set; } /// Änderungen in den Garantievereinbarungen. Falls in dieser Komponenten angegeben, werden die Tarifparameter hiermit überschrieben. Details - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "garantieaenderung", Required = Required.Default)] [ProtoMember(15)] - public Preisgarantie garantieaenderung; + public Preisgarantie Garantieaenderung { get; set; } /// Änderungen in den Einschränkungen zum Tarif. Falls in dieser Komponenten angegeben, werden die Tarifparameter hiermit überschrieben. Details - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "einschraenkungsaenderung", Required = Required.Default)] [ProtoMember(16)] - public Tarifeinschraenkung einschraenkungsaenderung; + public Tarifeinschraenkung Einschraenkungsaenderung { get; set; } /// Werte für die gestaffelten Auf/Abschläge mit regionaler Eingrenzung. Details - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "staffeln", Required = Required.Always)] [ProtoMember(17)] - public List staffeln; + public List Staffeln { get; set; } } } \ No newline at end of file diff --git a/BO4E-dotnet/COM/Regionskriterium.cs b/BO4E-dotnet/COM/Regionskriterium.cs index 5b3178c3..cf428d7d 100644 --- a/BO4E-dotnet/COM/Regionskriterium.cs +++ b/BO4E-dotnet/COM/Regionskriterium.cs @@ -1,5 +1,7 @@ using BO4E.ENUM; + using Newtonsoft.Json; + using ProtoBuf; namespace BO4E.COM @@ -11,38 +13,38 @@ namespace BO4E.COM public class Regionskriterium : COM { /// - /// Hier wird festgelegt, ob es sich um ein einschließendes oder ausschließendes Kriterium handelt.Details siehe + /// Hier wird festgelegt, ob es sich um ein einschließendes oder ausschließendes Kriterium handelt.Details siehe /// - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "gueltigkeitstyp", Required = Required.Always)] [ProtoMember(3)] - public Gueltigkeitstyp gueltigkeitstyp; + public Gueltigkeitstyp Gueltigkeitstyp { get; set; } /// - /// Das Kriterium gilt in der angegebenen Sparte.Details siehe + /// Das Kriterium gilt in der angegebenen Sparte.Details siehe /// - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "sparte", Required = Required.Default)] [ProtoMember(4)] - public Sparte? sparte; + public Sparte? Sparte { get; set; } /// - /// Unterscheidung, wie der Wert angewendet werden soll, z.B.kleiner, größer, gleich.Details siehe + /// Unterscheidung, wie der Wert angewendet werden soll, z.B.kleiner, größer, gleich.Details siehe /// - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "mengenoperator", Required = Required.Always)] [ProtoMember(5)] - public Mengenoperator mengenoperator; + public Mengenoperator Mengenoperator { get; set; } /// - /// Hier wird das Kriterium selbst angegeben, z.B.Bundesland. Details siehe + /// Hier wird das Kriterium selbst angegeben, z.B.Bundesland. Details siehe /// - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "regionskriteriumtyp", Required = Required.Always)] [ProtoMember(6)] - public Regionskriteriumtyp regionskriteriumtyp; + public Regionskriteriumtyp Regionskriteriumtyp { get; set; } /// /// Der Wert, den das Kriterium annehmen kann, z.B.NRW.Im Falle des Regionskriteriumstyp BUNDESWEIT spielt dieser Wert keine Rolle. /// - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "wert", Required = Required.Always)] [ProtoMember(7)] - public string wert; + public string Wert { get; set; } } } \ No newline at end of file diff --git a/BO4E-dotnet/COM/Rufnummer.cs b/BO4E-dotnet/COM/Rufnummer.cs index a7a81a10..23c71379 100644 --- a/BO4E-dotnet/COM/Rufnummer.cs +++ b/BO4E-dotnet/COM/Rufnummer.cs @@ -1,5 +1,7 @@ using BO4E.ENUM; + using Newtonsoft.Json; + using ProtoBuf; namespace BO4E.COM @@ -9,13 +11,15 @@ namespace BO4E.COM public class Rufnummer : COM { /// Ausprägung der Nummer, z.B. Zentrale, Faxnummer, Mobilnummer etc. Details - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "nummerntyp", Required = Required.Always)] [ProtoMember(3)] - public Rufnummernart nummerntyp; + public Rufnummernart Nummerntyp { get; set; } /// Die konkrete Nummer, z.B. 02433 5 26 01 900 - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "rufnummer", Required = Required.Always)] [ProtoMember(4)] - public string rufnummer; +#pragma warning disable IDE1006 // Naming Styles + public string rufnummer { get; set; } +#pragma warning restore IDE1006 // Naming Styles } } \ No newline at end of file diff --git a/BO4E-dotnet/COM/Sigmoidparameter.cs b/BO4E-dotnet/COM/Sigmoidparameter.cs index 2be81dd7..cb7cfa9e 100644 --- a/BO4E-dotnet/COM/Sigmoidparameter.cs +++ b/BO4E-dotnet/COM/Sigmoidparameter.cs @@ -1,4 +1,5 @@ using Newtonsoft.Json; + using ProtoBuf; namespace BO4E.COM @@ -8,23 +9,23 @@ namespace BO4E.COM public class Sigmoidparameter : COM { /// Briefmarke Ortsverteilnetz //? - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "A", Required = Required.Always)] [ProtoMember(3)] - public decimal A; + public decimal A { get; set; } /// Wendepunkt für die bepreiste Menge - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "B", Required = Required.Always)] [ProtoMember(4)] - public decimal B; + public decimal B { get; set; } /// Exponent - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "C", Required = Required.Always)] [ProtoMember(5)] - public decimal C; + public decimal C { get; set; } /// Briefmarke Transportnetz - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "D", Required = Required.Always)] [ProtoMember(6)] - public decimal D; + public decimal D { get; set; } } } \ No newline at end of file diff --git a/BO4E-dotnet/COM/Steuerbetrag.cs b/BO4E-dotnet/COM/Steuerbetrag.cs index 2b759c46..a91a2854 100644 --- a/BO4E-dotnet/COM/Steuerbetrag.cs +++ b/BO4E-dotnet/COM/Steuerbetrag.cs @@ -1,6 +1,8 @@ using BO4E.ENUM; using BO4E.meta; + using Newtonsoft.Json; + using ProtoBuf; namespace BO4E.COM @@ -9,28 +11,28 @@ namespace BO4E.COM [ProtoContract] public class Steuerbetrag : COM { - /// Kennzeichnung des Steuersatzes, bzw. Verfahrens. Details - [JsonProperty(Required = Required.Always)] + /// Kennzeichnung des Steuersatzes, bzw. Verfahrens. Details + [JsonProperty(PropertyName = "steuerkennzeichen", Required = Required.Always)] [FieldName("taxIdentifier", Language.EN)] [ProtoMember(3)] - public Steuerkennzeichen steuerkennzeichen; + public Steuerkennzeichen Steuerkennzeichen { get; set; } /// Nettobetrag für den die Steuer berechnet wurde. Z.B. 100 - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "basiswert", Required = Required.Always)] [FieldName("baseValue", Language.EN)] [ProtoMember(4)] - public decimal basiswert; + public decimal Basiswert { get; set; } /// Aus dem Basiswert berechnete Steuer. Z.B. 19 (bei UST_19) - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "steuerwert", Required = Required.Always)] [FieldName("taxValue", Language.EN)] [ProtoMember(5)] - public decimal steuerwert; + public decimal Steuerwert { get; set; } /// Währung. Z.B. Euro. - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "waehrung", Required = Required.Always)] [FieldName("currency", Language.EN)] [ProtoMember(6)] - public Waehrungscode waehrung; + public Waehrungscode Waehrung { get; set; } } } \ No newline at end of file diff --git a/BO4E-dotnet/COM/Tarifberechnungsparameter.cs b/BO4E-dotnet/COM/Tarifberechnungsparameter.cs index b839ce56..812a0d70 100644 --- a/BO4E-dotnet/COM/Tarifberechnungsparameter.cs +++ b/BO4E-dotnet/COM/Tarifberechnungsparameter.cs @@ -1,5 +1,7 @@ using BO4E.ENUM; + using Newtonsoft.Json; + using ProtoBuf; namespace BO4E.COM @@ -9,47 +11,48 @@ namespace BO4E.COM public class Tarifberechnungsparameter : COM { /// Gibt an, wie die Einzelpreise des Tarifes zu verarbeiten sind. Details - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "berechnungsmethode", Required = Required.Default)] [ProtoMember(3)] - public Tarifkalkulationsmethode? berechnungsmethode; - + public Tarifkalkulationsmethode? Berechnungsmethode { get; set; } + /// Zeigt an, ob der Messpreis im Grundpreis enthalten ist. - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "messpreisInGPEnthalten", Required = Required.Default)] [ProtoMember(4)] - public string messpreisInGPEnthalten; + public string MesspreisInGPEnthalten { get; set; } - /// Typ des Messpreises. Details + /// Typ des Messpreises. Details [ProtoMember(5)] - public Messpreistyp? messpreistyp; - + [JsonProperty(PropertyName = "messpreistyp", Required = Required.Default)] + public Messpreistyp? Messpreistyp { get; set; } + /// Im Preis bereits eingeschlossene Leistung (für Gas). - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "kwInklusive", Required = Required.Default)] [ProtoMember(6)] - public decimal? kwInklusive; - + public decimal? KwInklusive { get; set; } + /// Intervall, indem die über "kwInklusive" hinaus abgenommene Leistung kostenpflichtig wird (z.B. je 5 kW 20 EURO). - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "kwWeitereMengen", Required = Required.Default)] [ProtoMember(7)] - public decimal? kwWeitereMengen; - + public decimal? KwWeitereMengen { get; set; } + /// Bei der Bildung des Durchschnittspreises für die Höchst- und Mindestpreisbetrachtung wird in Abhängigkeit von diesem Flag der Messpreis mit berücksichtigt. - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "messpreisBeruecksichtigen", Required = Required.Default)] [ProtoMember(9)] - public bool? messpreisBeruecksichtigen; - + public bool? MesspreisBeruecksichtigen { get; set; } + /// Höchstpreis für den Durchschnitts-Arbeitspreis NT. Details - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "hoechstpreisNT", Required = Required.Default)] [ProtoMember(10)] - public Preis hoechstpreisNT; - + public Preis HoechstpreisNT { get; set; } + /// Höchstpreis für den Durchschnitts-Arbeitspreis HT. Details - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "hoechstpreisHT", Required = Required.Default)] [ProtoMember(11)] - public Preis hoechstpreisHT; - + public Preis HoechstpreisHT { get; set; } + /// Mindestpreis für den Durchschnitts-Arbeitspreis. Details - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "mindestpreis", Required = Required.Default)] [ProtoMember(12)] - public Preis mindestpreis; + public Preis Mindestpreis { get; set; } } } \ No newline at end of file diff --git a/BO4E-dotnet/COM/Tarifeinschraenkung.cs b/BO4E-dotnet/COM/Tarifeinschraenkung.cs index e61f7e4a..b2a1fc92 100644 --- a/BO4E-dotnet/COM/Tarifeinschraenkung.cs +++ b/BO4E-dotnet/COM/Tarifeinschraenkung.cs @@ -1,6 +1,9 @@ using System.Collections.Generic; + using BO4E.ENUM; + using Newtonsoft.Json; + using ProtoBuf; namespace BO4E.COM @@ -10,23 +13,23 @@ namespace BO4E.COM public class Tarifeinschraenkung : COM { /// Weitere Produkte, die gemeinsam mit diesem Tarif bestellt werden können. - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "zusatzprodukte", Required = Required.Default)] [ProtoMember(3)] - public List zusatzprodukte; + public List Zusatzprodukte { get; set; } - /// Voraussetzungen, die erfüllt sein müssen, damit dieser Tarif zur Anwendung kommen kann. Details - [JsonProperty(Required = Required.Default)] + /// Voraussetzungen, die erfüllt sein müssen, damit dieser Tarif zur Anwendung kommen kann. Details + [JsonProperty(PropertyName = "voraussetzungen", Required = Required.Default)] [ProtoMember(4)] - public List voraussetzungen; + public List Voraussetzungen { get; set; } /// Liste der Zähler/Geräte, die erforderlich sind, damit dieser Tarif zur Anwendung gelangen kann.(Falls keine Zähler angegeben sind, ist der Tarif nicht an das Vorhandensein bestimmter Zähler gebunden.)Details - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "einschraenkungzaehler", Required = Required.Default)] [ProtoMember(5)] - public Geraet einschraenkungzaehler; + public Geraet Einschraenkungzaehler { get; set; } /// Die vereinbarte Leistung, die (näherungsweise) abgenommen wird. Insbesondere Gastarife können daran gebunden sein, dass die Leistung einer vereinbarten Höhe entspricht.Details - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "einschraenkungleistung", Required = Required.Default)] [ProtoMember(6)] - public Menge einschraenkungleistung; + public Menge Einschraenkungleistung { get; set; } } } \ No newline at end of file diff --git a/BO4E-dotnet/COM/Tarifpreisposition.cs b/BO4E-dotnet/COM/Tarifpreisposition.cs index 4a9096b6..2ec30576 100644 --- a/BO4E-dotnet/COM/Tarifpreisposition.cs +++ b/BO4E-dotnet/COM/Tarifpreisposition.cs @@ -1,5 +1,7 @@ using BO4E.ENUM; + using Newtonsoft.Json; + using ProtoBuf; namespace BO4E.COM @@ -8,29 +10,29 @@ namespace BO4E.COM [ProtoContract] public class Tarifpreisposition : COM { - /// Angabe des Preistypes (z.B. Grundpreis) Details - [JsonProperty(Required = Required.Always)] + /// Angabe des Preistypes (z.B. Grundpreis) Details + [JsonProperty(PropertyName = "preistyp", Required = Required.Always)] [ProtoMember(3)] - public Preistyp preistyp; + public Preistyp Preistyp { get; set; } /// Einheit des Preises (z.B. EURO) Details - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "einheit", Required = Required.Always)] [ProtoMember(4)] - public Waehrungseinheit einheit; + public Waehrungseinheit Einheit { get; set; } /// Größe, auf die sich die Einheit bezieht, beispielsweise kWh, Jahr. Details - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "bezugseinheit", Required = Required.Always)] [ProtoMember(5)] - public Mengeneinheit bezugseinheit; + public Mengeneinheit Bezugseinheit { get; set; } /// Gibt an, nach welcher Menge die vorgenannte Einschränkung erfolgt (z.B. Jahresstromverbrauch in kWh).Details - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "mengeneinheitstaffel", Required = Required.Default)] [ProtoMember(6)] - public Mengeneinheit? mengeneinheitstaffel; + public Mengeneinheit? Mengeneinheitstaffel { get; set; } /// Hier sind die Staffeln mit ihren Preisenangaben definiert. Struktur - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "preisstaffeln", Required = Required.Always)] [ProtoMember(7)] - public Preisstaffel preisstaffeln; + public Preisstaffel Preisstaffeln { get; set; } } } \ No newline at end of file diff --git a/BO4E-dotnet/COM/Unterschrift.cs b/BO4E-dotnet/COM/Unterschrift.cs index cd33e765..64dfd93e 100644 --- a/BO4E-dotnet/COM/Unterschrift.cs +++ b/BO4E-dotnet/COM/Unterschrift.cs @@ -1,5 +1,7 @@ using System; + using Newtonsoft.Json; + using ProtoBuf; namespace BO4E.COM @@ -14,22 +16,22 @@ public class Unterschrift : COM /// /// Ort, an dem die Unterschrift geleistet wird /// - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "ort", Required = Required.Default)] [ProtoMember(3)] - public string ort; + public string Ort { get; set; } /// /// Datum der Unterschrift /// - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "datum", Required = Required.Default)] [ProtoMember(4)] - public DateTime? datum; + public DateTime? Datum { get; set; } /// /// Name des Unterschreibers /// - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "name", Required = Required.Always)] [ProtoMember(5)] - public string name; + public string Name { get; set; } } } diff --git a/BO4E-dotnet/COM/Verbrauch.cs b/BO4E-dotnet/COM/Verbrauch.cs index 639cee88..00e3ffd3 100644 --- a/BO4E-dotnet/COM/Verbrauch.cs +++ b/BO4E-dotnet/COM/Verbrauch.cs @@ -1,9 +1,12 @@ using System; using System.IO; using System.Runtime.Serialization; + using BO4E.ENUM; +using BO4E.meta; using Newtonsoft.Json; using Newtonsoft.Json.Linq; + using ProtoBuf; namespace BO4E.COM @@ -18,7 +21,7 @@ public class Verbrauch : COM /// Central Europe Standard Time as hard coded default time. Public to be used elsewhere ;) /// [ProtoIgnore] - public static readonly TimeZoneInfo CENTRAL_EUROPE_STANDARD_TIME; + public static TimeZoneInfo CENTRAL_EUROPE_STANDARD_TIME { get; private set; } static Verbrauch() { var assembly = typeof(Verbrauch).Assembly; // ??? zumindest eher als executing assembly. @@ -37,24 +40,24 @@ static Verbrauch() /// /// Beginn des Zeitraumes, für den der Verbrauch angegeben wird. /// - [JsonProperty(Required = Required.Default, Order = 7)] + [JsonProperty(PropertyName = "startdatum", Required = Required.Default, Order = 7)] [ProtoMember(3)] - public DateTime startdatum; + public DateTime Startdatum { get; set; } /// /// Ende des Zeitraumes, für den der Verbrauch angegeben wird. /// - [JsonProperty(Required = Required.Default, Order = 8)] + [JsonProperty(PropertyName = "enddatum", Required = Required.Default, Order = 8)] [ProtoMember(4)] - public DateTime enddatum; // ToDo: is DateTime? better suited? + public DateTime Enddatum { get; set; } // ToDo: is DateTime? better suited? /// /// Gibt an, ob es sich um eine PROGNOSE oder eine MESSUNG handelt. /// - /// - [JsonProperty(Required = Required.Always, Order = 5)] + /// + [JsonProperty(PropertyName = "wertermittlungsverfahren", Required = Required.Always, Order = 5)] [ProtoMember(5)] - public Wertermittlungsverfahren wertermittlungsverfahren; + public Wertermittlungsverfahren Wertermittlungsverfahren { get; set; } /// /// Die OBIS-Kennzahl für den Wert, die festlegt, welche Größe mit dem Stand gemeldet wird. @@ -62,30 +65,31 @@ static Verbrauch() /// /// 1-0:1.8.1 /// - [JsonProperty(Required = Required.Always, Order = 6)] + [JsonProperty(PropertyName = "obiskennzahl", Required = Required.Always, Order = 6)] [ProtoMember(6)] - public string obiskennzahl; + public string Obiskennzahl { get; set; } /// /// Gibt den absoluten Wert der Menge an. /// - [JsonProperty(Required = Required.Always, Order = 7)] + [JsonProperty(PropertyName = "wert", Required = Required.Always, Order = 7)] [ProtoMember(7)] - public decimal wert; + public decimal Wert { get; set; } /// /// Gibt die Einheit zum jeweiligen Wert an. /// /// - [JsonProperty(Required = Required.Always, Order = 8)] + [JsonProperty(PropertyName = "einheit", Required = Required.Always, Order = 8)] [ProtoMember(8)] - public Mengeneinheit einheit; + public Mengeneinheit Einheit { get; set; } /// type /// arbeitleistungtagesparameterabhmalo | veranschlagtejahresmenge | TUMKundenwert - [JsonProperty(Required = Required.Default)] + [NonOfficial(NonOfficialCategory.UNSPECIFIED)] + [JsonProperty(PropertyName = "type", Required = Required.Default)] [ProtoMember(9)] - public Verbrauchsmengetyp? type; + public Verbrauchsmengetyp? Type { get; set; } /// [OnDeserialized] @@ -128,45 +132,45 @@ public void FixSapCdsBug() { //using (MiniProfiler.Current.Step("FixSapCdsBug (Verbrauch)")) // don't do this. it slows down everything ! // { - if (startdatum != null && enddatum != null && startdatum > enddatum) + if (Startdatum != null && Enddatum != null && Startdatum > Enddatum) { - TimeSpan diff = startdatum - enddatum; - if (diff.Hours <= 25 && diff.Hours >= 23 && diff.Minutes == 45 && startdatum.Hour >= 22 && enddatum.Hour == 0) + TimeSpan diff = Startdatum - Enddatum; + if (diff.Hours <= 25 && diff.Hours >= 23 && diff.Minutes == 45 && Startdatum.Hour >= 22 && Enddatum.Hour == 0) { - enddatum += new TimeSpan(diff.Hours + 1, 0, 0); + Enddatum += new TimeSpan(diff.Hours + 1, 0, 0); } else { // something seems wrong but not sure how to fix it. } } - startdatum = DateTime.SpecifyKind(startdatum, DateTimeKind.Utc); - enddatum = DateTime.SpecifyKind(enddatum, DateTimeKind.Utc); - if ((int)(enddatum - startdatum).TotalHours == 2) + Startdatum = DateTime.SpecifyKind(Startdatum, DateTimeKind.Utc); + Enddatum = DateTime.SpecifyKind(Enddatum, DateTimeKind.Utc); + if ((int)(Enddatum - Startdatum).TotalHours == 2) { // check DST of start and enddatum - var startdatumLocal = TimeZoneInfo.ConvertTimeFromUtc(startdatum, Verbrauch.CENTRAL_EUROPE_STANDARD_TIME); - var enddatumLocal = TimeZoneInfo.ConvertTimeFromUtc(enddatum, Verbrauch.CENTRAL_EUROPE_STANDARD_TIME); + var startdatumLocal = TimeZoneInfo.ConvertTimeFromUtc(Startdatum, Verbrauch.CENTRAL_EUROPE_STANDARD_TIME); + var enddatumLocal = TimeZoneInfo.ConvertTimeFromUtc(Enddatum, Verbrauch.CENTRAL_EUROPE_STANDARD_TIME); if (!Verbrauch.CENTRAL_EUROPE_STANDARD_TIME.IsDaylightSavingTime(startdatumLocal - new TimeSpan(0, 0, 1)) && Verbrauch.CENTRAL_EUROPE_STANDARD_TIME.IsDaylightSavingTime(enddatumLocal)) { // change winter-->summer time (e.g. UTC+1-->UTC+2) // this is an artefact of the sap enddatum computation - enddatum -= new TimeSpan(1, 0, 0); // toDo: get offset from timezoneinfo->rules->dstOffset + Enddatum -= new TimeSpan(1, 0, 0); // toDo: get offset from timezoneinfo->rules->dstOffset } } - else if ((int)(enddatum - startdatum).TotalMinutes == -45) + else if ((int)(Enddatum - Startdatum).TotalMinutes == -45) { // check DST of start and enddatum //var startdatumLocal = TimeZoneInfo.ConvertTimeFromUtc(startdatum, Verbrauch.CENTRAL_EUROPE_STANDARD_TIME); - var enddatumLocal = TimeZoneInfo.ConvertTimeFromUtc(enddatum, Verbrauch.CENTRAL_EUROPE_STANDARD_TIME); + var enddatumLocal = TimeZoneInfo.ConvertTimeFromUtc(Enddatum, Verbrauch.CENTRAL_EUROPE_STANDARD_TIME); if (!Verbrauch.CENTRAL_EUROPE_STANDARD_TIME.IsDaylightSavingTime(enddatumLocal - new TimeSpan(1, 0, 0)) && Verbrauch.CENTRAL_EUROPE_STANDARD_TIME.IsDaylightSavingTime(enddatumLocal - new TimeSpan(1, 0, 1))) { // change winter-->summer time (e.g. UTC+1-->UTC+2) // this is an artefact of the sap enddatum computation - enddatum += new TimeSpan(1, 0, 0); // toDo: get offset from timezoneinfo->rules->dstOffset + Enddatum += new TimeSpan(1, 0, 0); // toDo: get offset from timezoneinfo->rules->dstOffset } } - if (userProperties != null && userProperties.TryGetValue(_SAP_PROFDECIMALS_KEY, out JToken profDecimalsRaw)) + if (UserProperties != null && UserProperties.TryGetValue(_SAP_PROFDECIMALS_KEY, out JToken profDecimalsRaw)) { var profDecimals = profDecimalsRaw.Value(); if (profDecimals > 0) @@ -174,10 +178,10 @@ public void FixSapCdsBug() // or should I import math.pow() for this purpose? for (int i = 0; i < profDecimals; i++) { - wert /= 10.0M; + Wert /= 10.0M; } } - userProperties.Remove(_SAP_PROFDECIMALS_KEY); + UserProperties.Remove(_SAP_PROFDECIMALS_KEY); } } diff --git a/BO4E-dotnet/COM/Vertragskonditionen.cs b/BO4E-dotnet/COM/Vertragskonditionen.cs index a2c65626..291df368 100644 --- a/BO4E-dotnet/COM/Vertragskonditionen.cs +++ b/BO4E-dotnet/COM/Vertragskonditionen.cs @@ -1,8 +1,11 @@ +using System; + using BO4E.ENUM; using BO4E.meta; + using Newtonsoft.Json; + using ProtoBuf; -using System; namespace BO4E.COM @@ -12,93 +15,93 @@ namespace BO4E.COM public class Vertragskonditionen : COM { /// Freitext zur Beschreibung der Konditionen, z.B. "Standardkonditionen Gas" - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "beschreibung", Required = Required.Default)] [ProtoMember(3)] - public string beschreibung; + public string Beschreibung { get; set; } /// Anzahl der vereinbarten Abschläge pro Jahr, z.B. 12 - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "anzahlAbschlaege", Required = Required.Default)] [ProtoMember(4)] - public int? anzahlAbschlaege; //ToDo: bo4e.de models this as decimal which is wrong imho + public int? AnzahlAbschlaege { get; set; } //ToDo: bo4e.de models this as decimal which is wrong imho /// Über diesen Zeitraum läuft der Vertrag. Details - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "vertragslaufzeit", Required = Required.Default)] [ProtoMember(5)] - public Zeitraum vertragslaufzeit; + public Zeitraum Vertragslaufzeit { get; set; } /// Innerhalb dieser Frist kann der Vertrag gekündigt werden. Details - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "kuendigungsfrist", Required = Required.Default)] [ProtoMember(6)] - public Zeitraum kuendigungsfrist; + public Zeitraum Kuendigungsfrist { get; set; } /// Falls der Vertrag nicht gekündigt wird, verlängert er sich automatisch um die hier angegebene Zeit. Details - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "vertragsverlaengerung", Required = Required.Default)] [ProtoMember(7)] - public Zeitraum vertragsverlaengerung; + public Zeitraum Vertragsverlaengerung { get; set; } /// In diesen Zyklen werden Abschläge gestellt. Details . Alternativ kann auch die Anzahl in den Konditionen angeben werden." - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "abschlagszyklus", Required = Required.Default)] [ProtoMember(8)] - public Zeitraum abschlagszyklus; + public Zeitraum Abschlagszyklus { get; set; } // ToDo: Docstring! - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "startAbrechnungsjahr", Required = Required.Default)] [NonOfficial(NonOfficialCategory.CUSTOMER_REQUIREMENTS)] [ProtoMember(1009)] - public DateTime? startAbrechnungsjahr; + public DateTime? StartAbrechnungsjahr { get; set; } // ToDo: Docstring! why is this a zeitraum and no DateTime?? - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "geplanteTurnusablesung", Required = Required.Default)] [NonOfficial(NonOfficialCategory.CUSTOMER_REQUIREMENTS)] [ProtoMember(1010)] - public Zeitraum geplanteTurnusablesung; + public Zeitraum GeplanteTurnusablesung { get; set; } // ToDo: Docstring! what is the unit? days? why don't you use zeitraum? - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "turnusablesungIntervall", Required = Required.Default)] [NonOfficial(NonOfficialCategory.CUSTOMER_REQUIREMENTS)] [ProtoMember(1011)] - public int? turnusablesungIntervall; + public int? TurnusablesungIntervall { get; set; } // ToDo: Docstring! - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "netznutzungsabrechnung", Required = Required.Default)] [NonOfficial(NonOfficialCategory.CUSTOMER_REQUIREMENTS)] [ProtoMember(1012)] - public Zeitraum netznutzungsabrechnung; + public Zeitraum Netznutzungsabrechnung { get; set; } // ToDo: Docstring! what is the unit? days? why dont you use zeitraum? - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "netznutzungsabrechnungIntervall", Required = Required.Default)] [NonOfficial(NonOfficialCategory.CUSTOMER_REQUIREMENTS)] [ProtoMember(1013)] - public int? netznutzungsabrechnungIntervall; + public int? NetznutzungsabrechnungIntervall { get; set; } // ToDo: Docstring! - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "haushaltskunde", Required = Required.Default)] [NonOfficial(NonOfficialCategory.CUSTOMER_REQUIREMENTS)] [ProtoMember(1014)] - public bool? haushaltskunde; + public bool? Haushaltskunde { get; set; } // ToDo: Docstring! - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "netznutzungsvertrag", Required = Required.Default)] [NonOfficial(NonOfficialCategory.CUSTOMER_REQUIREMENTS)] [ProtoMember(1015)] - public NetznutzungsVertrag? netznutzungsvertrag; + public NetznutzungsVertrag? Netznutzungsvertrag { get; set; } // ToDo: Docstring! - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "netznutzungszahler", Required = Required.Default)] [NonOfficial(NonOfficialCategory.CUSTOMER_REQUIREMENTS)] [ProtoMember(1016)] - public Netznutzungszahler? netznutzungszahler; + public Netznutzungszahler? Netznutzungszahler { get; set; } // ToDo: Docstring! - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "netznutzungsabrechnungsvariante", Required = Required.Default)] [NonOfficial(NonOfficialCategory.CUSTOMER_REQUIREMENTS)] [ProtoMember(1017)] - public Netznutzungsabrechnungsvariante? netznutzungsabrechnungsvariante; + public Netznutzungsabrechnungsvariante? Netznutzungsabrechnungsvariante { get; set; } // ToDo: Docstring! - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "netznutzungsabrechnungsgrundlage", Required = Required.Default)] [NonOfficial(NonOfficialCategory.CUSTOMER_REQUIREMENTS)] [ProtoMember(1018)] - public Netznutzungsabrechnungsgrundlage? netznutzungsabrechnungsgrundlage; + public Netznutzungsabrechnungsgrundlage? Netznutzungsabrechnungsgrundlage { get; set; } } } \ No newline at end of file diff --git a/BO4E-dotnet/COM/Vertragsteil.cs b/BO4E-dotnet/COM/Vertragsteil.cs index 61681933..82916b18 100644 --- a/BO4E-dotnet/COM/Vertragsteil.cs +++ b/BO4E-dotnet/COM/Vertragsteil.cs @@ -1,6 +1,9 @@ using System; + using BO4E.meta; + using Newtonsoft.Json; + using ProtoBuf; namespace BO4E.COM @@ -15,68 +18,68 @@ public class Vertragsteil : COM /// /// Start der Gültigkeit des Vertragsteils. /// - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "vertragsteilbeginn", Required = Required.Always)] [ProtoMember(3)] - public DateTime vertragsteilbeginn; + public DateTime Vertragsteilbeginn { get; set; } /// /// Ende der Gültigkeit des Vertragsteils. /// - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "vertragsteilende", Required = Required.Always)] [ProtoMember(4)] - public DateTime vertragsteilende; + public DateTime Vertragsteilende { get; set; } /// /// Der Identifier für diejenigen Markt- oder Messlokation, die zu diesem Vertragsteil gehören. /// Verträge für mehrere Lokationen werden mit mehreren Vertragsteilen abgebildet. /// [ProtoMember(5)] - [JsonProperty(Required = Required.Default)] - public string lokation; + [JsonProperty(PropertyName = "lokation", Required = Required.Default)] + public string Lokation { get; set; } /// /// Für die Lokation festgeschriebene Abnahmemenge. Siehe COM Menge /// - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "vertraglichFixierteMenge", Required = Required.Default)] [ProtoMember(6)] - public Menge vertraglichFixierteMenge; + public Menge VertraglichFixierteMenge { get; set; } /// /// Für die Lokation festgelegte Mindestabnahmemenge. Siehe COM Menge /// - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "minimaleAbnahmemenge", Required = Required.Default)] [ProtoMember(7)] - public Menge minimaleAbnahmemenge; + public Menge MinimaleAbnahmemenge { get; set; } /// /// Für die Lokation festgelegte maximale Abnahmemenge. Siehe COM Menge /// - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "maximaleAbnahmemenge", Required = Required.Default)] [ProtoMember(8)] - public Menge maximaleAbnahmemenge; + public Menge MaximaleAbnahmemenge { get; set; } /// /// jahresverbrauchsprognose für EDIFACT mapping /// - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "jahresverbrauchsprognose", Required = Required.Default)] [NonOfficial(NonOfficialCategory.CUSTOMER_REQUIREMENTS)] [ProtoMember(1009)] - public Menge jahresverbrauchsprognose; + public Menge Jahresverbrauchsprognose { get; set; } /// /// kundenwert für EDIFACT mapping /// - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "kundenwert", Required = Required.Default)] [NonOfficial(NonOfficialCategory.CUSTOMER_REQUIREMENTS)] [ProtoMember(1010)] - public Menge kundenwert; + public Menge Kundenwert { get; set; } /// /// verbrauchsaufteilung für EDIFACT mapping /// - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "verbrauchsaufteilung", Required = Required.Default)] [NonOfficial(NonOfficialCategory.CUSTOMER_REQUIREMENTS)] [ProtoMember(1011)] - public string verbrauchsaufteilung; // ToDo: evaluate if this actually should be an enum + public string Verbrauchsaufteilung { get; set; } // ToDo: evaluate if this actually should be an enum } } diff --git a/BO4E-dotnet/COM/Zaehlwerk.cs b/BO4E-dotnet/COM/Zaehlwerk.cs index f39c2470..86c9c8f7 100644 --- a/BO4E-dotnet/COM/Zaehlwerk.cs +++ b/BO4E-dotnet/COM/Zaehlwerk.cs @@ -1,9 +1,12 @@ +using System; +using System.Collections.Generic; + using BO4E.ENUM; using BO4E.meta; + using Newtonsoft.Json; + using ProtoBuf; -using System; -using System.Collections.Generic; namespace BO4E.COM { @@ -12,91 +15,91 @@ namespace BO4E.COM public class Zaehlwerk : COM { /// Identifikation des Zählwerks (Registers) innerhalb des Zählers. Oftmals eine laufende Nummer hinter der Zählernummer. Z.B. 47110815_1 - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "zaehlwerkId", Required = Required.Always)] [ProtoMember(3)] - public string zaehlwerkId; + public string ZaehlwerkId { get; set; } /// Zusätzliche Bezeichnung, z.B. Zählwerk_Wirkarbeit. - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "bezeichnung", Required = Required.Always)] [ProtoMember(4)] - public string bezeichnung; + public string Bezeichnung { get; set; } /// Die Energierichtung, Einspeisung oder Ausspeisung. Details - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "richtung", Required = Required.Always)] [ProtoMember(5)] - public Energierichtung richtung; + public Energierichtung Richtung { get; set; } /// Die OBIS-Kennzahl für das Zählwerk, die festlegt, welche auf die gemessene Größe mit dem Stand gemeldet wird. Nur Zählwerkstände mit dieser OBIS-Kennzahl werden an diesem Zählwerk registriert. Beispiel:1-0:1.8.1 für elektrische Wirkarbeit. - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "obisKennzahl", Required = Required.Always)] [ProtoMember(6)] - public string obisKennzahl; + public string ObisKennzahl { get; set; } /// Mit diesem Faktor wird eine Zählerstandsdifferenz multipliziert, um zum eigentlichen Verbrauch im Zeitraum zu kommen. - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "wandlerfaktor", Required = Required.Always)] [ProtoMember(7)] - public decimal wandlerfaktor; + public decimal Wandlerfaktor { get; set; } /// Die Einheit der gemessenen Größe, z.B. kWh. Details - [JsonProperty(Required = Required.Always)] + [JsonProperty(PropertyName = "einheit", Required = Required.Always)] [ProtoMember(8)] - public Mengeneinheit einheit; + public Mengeneinheit Einheit { get; set; } /// Obis kennzahl - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "kennzahl", Required = Required.Default)] [NonOfficial(NonOfficialCategory.CUSTOMER_REQUIREMENTS)] [Obsolete("Use existing obisKennzahl instead.", true)] [ProtoMember(1009)] - public string kennzahl; + public string Kennzahl { get; set; } /// schwachlastfaehig - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "schwachlastfaehig", Required = Required.Default)] [NonOfficial(NonOfficialCategory.CUSTOMER_REQUIREMENTS)] [ProtoMember(1010)] - public Schwachlastfaehig? schwachlastfaehig; + public Schwachlastfaehig? Schwachlastfaehig { get; set; } /// Verwendungungszweck der Werte Marktlokation - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "verwendungszwecke", Required = Required.Default)] [NonOfficial(NonOfficialCategory.CUSTOMER_REQUIREMENTS)] [ProtoMember(1011)] - public List verwendungszwecke; + public List Verwendungszwecke { get; set; } /// Stromverbrauchsart/Verbrauchsart Marktlokation - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "verbrauchsart", Required = Required.Default)] [NonOfficial(NonOfficialCategory.CUSTOMER_REQUIREMENTS)] [ProtoMember(1012)] - public Verbrauchsart? verbrauchsart; + public Verbrauchsart? Verbrauchsart { get; set; } /// Stromverbrauchsart/Unterbrechbarkeit Marktlokation - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "unterbrechbarkeit", Required = Required.Default)] [NonOfficial(NonOfficialCategory.CUSTOMER_REQUIREMENTS)] [ProtoMember(1013)] - public Unterbrechbarkeit? unterbrechbarkeit; + public Unterbrechbarkeit? Unterbrechbarkeit { get; set; } /// Stromverbrauchsart/Wärmenutzung Marktlokation - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "waermenutzung", Required = Required.Default)] [NonOfficial(NonOfficialCategory.CUSTOMER_REQUIREMENTS)] [ProtoMember(1014)] - public Waermenutzung? waermenutzung; + public Waermenutzung? Waermenutzung { get; set; } - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "konzessionsabgabe", Required = Required.Default)] [NonOfficial(NonOfficialCategory.CUSTOMER_REQUIREMENTS)] [ProtoMember(1015)] - public Konzessionsabgabe konzessionsabgabe; + public Konzessionsabgabe Konzessionsabgabe { get; set; } - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "steuerbefreit", Required = Required.Default)] [NonOfficial(NonOfficialCategory.CUSTOMER_REQUIREMENTS)] [ProtoMember(1016)] - public bool? steuerbefreit; + public bool? Steuerbefreit { get; set; } - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "vorkommastelle", Required = Required.Default)] [NonOfficial(NonOfficialCategory.CUSTOMER_REQUIREMENTS)] [ProtoMember(1017)] - public int? vorkommastelle; + public int? Vorkommastelle { get; set; } - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "nachkommastelle", Required = Required.Default)] [NonOfficial(NonOfficialCategory.CUSTOMER_REQUIREMENTS)] [ProtoMember(1018)] - public int? nachkommastelle; + public int? Nachkommastelle { get; set; } } } \ No newline at end of file diff --git a/BO4E-dotnet/COM/Zeitraum.cs b/BO4E-dotnet/COM/Zeitraum.cs index 72be3189..a5a6bb5e 100644 --- a/BO4E-dotnet/COM/Zeitraum.cs +++ b/BO4E-dotnet/COM/Zeitraum.cs @@ -1,8 +1,11 @@ using System; using System.Runtime.Serialization; + using BO4E.ENUM; using BO4E.meta; + using Newtonsoft.Json; + using ProtoBuf; namespace BO4E.COM @@ -12,57 +15,57 @@ namespace BO4E.COM public class Zeitraum : COM { /// Die Einheit in der die Dauer angeben ist. Z.B. Monate. - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "einheit", Required = Required.Default)] [FieldName("unit", Language.EN)] [ProtoMember(3)] - public Zeiteinheit? einheit; + public Zeiteinheit? Einheit { get; set; } /// Gibt die Anzahl der Zeiteinheiten an, z.B. 3 (Monate). - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "dauer", Required = Required.Default)] [FieldName("duration", Language.EN)] [ProtoMember(4)] - public decimal? dauer; + public decimal? Dauer { get; set; } /// Gibt Tag und Uhrzeit (falls vorhanden) an, wann der Zeitraum startet. - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "startdatum", Required = Required.Default)] [FieldName("startDate", Language.EN)] [ProtoMember(5)] - public DateTime? startdatum; + public DateTime? Startdatum { get; set; } /// Gibt Tag und Uhrzeit (falls vorhanden) an, wann der Zeitraum endet. - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "enddatum", Required = Required.Default)] [FieldName("endDate", Language.EN)] [ProtoMember(6)] - public DateTime? enddatum; + public DateTime? Enddatum { get; set; } /// - /// sets and iff and are given. + /// sets and iff and are given. /// [OnSerialized] public void FillNullValues(StreamingContext context) { - if (startdatum.HasValue && enddatum.HasValue) + if (Startdatum.HasValue && Enddatum.HasValue) { - TimeSpan ts = enddatum.Value - startdatum.Value; + TimeSpan ts = Enddatum.Value - Startdatum.Value; if (ts.TotalSeconds < 60) { - dauer = (decimal)ts.TotalSeconds; - einheit = Zeiteinheit.SEKUNDE; + Dauer = (decimal)ts.TotalSeconds; + Einheit = Zeiteinheit.SEKUNDE; } else if (ts.TotalSeconds < 3600) { - dauer = (decimal)ts.TotalMinutes; - einheit = Zeiteinheit.MINUTE; + Dauer = (decimal)ts.TotalMinutes; + Einheit = Zeiteinheit.MINUTE; } else if (ts.TotalSeconds < 24 * 3600) { - dauer = (decimal)ts.TotalHours; - einheit = Zeiteinheit.STUNDE; + Dauer = (decimal)ts.TotalHours; + Einheit = Zeiteinheit.STUNDE; } else// if (ts.TotalDays < 31) { - dauer = (decimal)ts.TotalDays; - einheit = Zeiteinheit.TAG; + Dauer = (decimal)ts.TotalDays; + Einheit = Zeiteinheit.TAG; } } } diff --git a/BO4E-dotnet/COM/Zustaendigkeit.cs b/BO4E-dotnet/COM/Zustaendigkeit.cs index 4bee72d6..617afece 100644 --- a/BO4E-dotnet/COM/Zustaendigkeit.cs +++ b/BO4E-dotnet/COM/Zustaendigkeit.cs @@ -1,5 +1,5 @@ -using BO4E.ENUM; using Newtonsoft.Json; + using ProtoBuf; namespace BO4E.COM @@ -9,16 +9,16 @@ namespace BO4E.COM public class Zustaendigkeit : COM { /// Berufliche Rolle des Ansprechpartners - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "jobtitel", Required = Required.Default)] [ProtoMember(3)] - public string jobtitel; + public string Jobtitel { get; set; } /// Abteilung, in der der Ansprechpartner tätig ist - [JsonProperty(Required = Required.Default)] + [JsonProperty(PropertyName = "abteilung", Required = Required.Default)] [ProtoMember(4)] - public string abteilung; - /// Hier kann eine thematische Zuordnung des APs angegeben werden. Details - [JsonProperty(Required = Required.Default)] + public string Abteilung { get; set; } + /// Hier kann eine thematische Zuordnung des APs angegeben werden. Details + [JsonProperty(PropertyName = "themengebiet", Required = Required.Default)] [ProtoMember(5)] - public string themengebiet; + public string Themengebiet { get; set; } } } \ No newline at end of file diff --git a/BO4E-dotnet/UserPropertiesDataContractResolver.cs b/BO4E-dotnet/UserPropertiesDataContractResolver.cs new file mode 100644 index 00000000..fd09ed64 --- /dev/null +++ b/BO4E-dotnet/UserPropertiesDataContractResolver.cs @@ -0,0 +1,51 @@ +using System; +using System.Collections.Generic; + +using Newtonsoft.Json.Serialization; + +namespace BO4E +{ + /// + /// The UserPropertiesContractResolver allows to put non-BO4E-standard/custom fields/properties into a "userProperties" object. + /// + public class UserPropertiesDataContractResolver : DefaultContractResolver + { + public static readonly UserPropertiesDataContractResolver Instance = new UserPropertiesDataContractResolver(new HashSet()); + + private readonly HashSet whitelist; + + /// + /// The UserPropertiesDataContractResolver is initialised with a white list of allowed properties. Everything else is discarded. + /// + /// white list of properties (actually a white"set") + public UserPropertiesDataContractResolver(HashSet userPropertiesWhiteList) + { + whitelist = userPropertiesWhiteList; + } + + public override JsonContract ResolveContract(Type type) + { + JsonContract contract = base.ResolveContract(type); + if (contract is JsonObjectContract objContract) + { + if (objContract.ExtensionDataSetter != null) + { + ExtensionDataSetter oldSetter = objContract.ExtensionDataSetter; + objContract.ExtensionDataSetter = (o, key, value) => + { + if (whitelist.Contains(key)) + { + oldSetter(o, key, value); + } + else + { + int a = 0; + a++; + } + }; + } + } + return contract; + } + } +} diff --git a/BO4E-dotnet/meta/Bo4eUri.cs b/BO4E-dotnet/meta/Bo4eUri.cs index 2b6e4753..a770374d 100644 --- a/BO4E-dotnet/meta/Bo4eUri.cs +++ b/BO4E-dotnet/meta/Bo4eUri.cs @@ -6,7 +6,9 @@ using System.Linq; using System.Reflection; using System.Text.RegularExpressions; + using BO4E.BO; + using Newtonsoft.Json; using Newtonsoft.Json.Linq; @@ -20,7 +22,7 @@ public class Bo4eUri : Uri { private const string BO4E_SCHEME = "bo4e://"; private const string NULL_KEY_PLACEHOLDER = "~"; // an allowed character in URLs that is not escaped - private static readonly Regex FILTER_AND_PATTERN = new Regex(@"\s*(?\w+)\s*(?:=|eq)\s*(['""]|)(?\w+)\1\s*(?:and)?\s*", RegexOptions.IgnoreCase|RegexOptions.Compiled); // \1 backreferences the '" group (in c#, would be \2 in other parsers) + private static readonly Regex FILTER_AND_PATTERN = new Regex(@"\s*(?\w+)\s*(?:=|eq)\s*(['""]|)(?\w+)\1\s*(?:and)?\s*", RegexOptions.IgnoreCase | RegexOptions.Compiled); // \1 backreferences the '" group (in c#, would be \2 in other parsers) /// /// Instantiates a Bo4eUri object. Throws Argument(Null)Exception if URI is null, not well formed ( or doesn't match the bo4e uri regex. @@ -141,38 +143,38 @@ public static Bo4eUri GetUri(BusinessObject bo, bool includeUserProperties = fal Bo4eUri baseUri = new Bo4eUri(baseUriString); string relativeUriString = string.Empty; - foreach (FieldInfo keyField in GetKeyFields(bo)) + foreach (PropertyInfo keyProp in GetKeyFields(bo)) { //relativeUriString += keyField.Name; // line is useful for debugging - if (keyField.GetValue(bo) != null) + if (keyProp.GetValue(bo) != null) { - if (keyField.GetValue(bo).GetType() == typeof(string)) + if (keyProp.GetValue(bo).GetType() == typeof(string)) { - if (keyField.GetValue(bo).ToString() == string.Empty) + if (keyProp.GetValue(bo).ToString() == string.Empty) { relativeUriString += NULL_KEY_PLACEHOLDER + "/"; } else { - relativeUriString += keyField.GetValue(bo) + "/"; + relativeUriString += keyProp.GetValue(bo) + "/"; } } - else if (keyField.GetValue(bo).GetType() == typeof(int)) + else if (keyProp.GetValue(bo).GetType() == typeof(int)) { - relativeUriString += keyField.GetValue(bo).ToString() + "/"; + relativeUriString += keyProp.GetValue(bo).ToString() + "/"; } - else if (keyField.GetValue(bo) is Enum) + else if (keyProp.GetValue(bo) is Enum) { - relativeUriString += keyField.GetValue(bo).ToString() + "/"; + relativeUriString += keyProp.GetValue(bo).ToString() + "/"; } - else if (keyField.GetValue(bo).GetType().IsSubclassOf(typeof(BusinessObject))) + else if (keyProp.GetValue(bo).GetType().IsSubclassOf(typeof(BusinessObject))) { - BusinessObject innerBo = (BusinessObject)keyField.GetValue(bo); + BusinessObject innerBo = (BusinessObject)keyProp.GetValue(bo); relativeUriString += GetUri(innerBo).GetComponents(UriComponents.Path, UriFormat.UriEscaped).ToString(); } else { - throw new NotImplementedException($"Using {keyField.GetValue(bo).GetType()} as [BoKey] is not supported yet."); + throw new NotImplementedException($"Using {keyProp.GetValue(bo).GetType()} as [BoKey] is not supported yet."); } } else @@ -185,10 +187,10 @@ public static Bo4eUri GetUri(BusinessObject bo, bool includeUserProperties = fal relativeUriString += NULL_KEY_PLACEHOLDER + "/"; } } - if (includeUserProperties && bo.userProperties != null && bo.userProperties.Count > 0) + if (includeUserProperties && bo.UserProperties != null && bo.UserProperties.Count > 0) { int n = 0; - foreach (var up in bo.userProperties) + foreach (var up in bo.UserProperties) { if (n == 0) { @@ -214,40 +216,43 @@ public static Bo4eUri GetUri(BusinessObject bo, bool includeUserProperties = fal } } - private static IList GetKeyFields(BusinessObject bo) + private static IList GetKeyFields(BusinessObject bo) { if (bo == null) { throw new ArgumentNullException("Business Object must not be null."); } - return GetKeyFields(bo.GetType()); + return GetKeyProperties(bo.GetType()); } - private static IList GetKeyFields(Type boType) + private static IList GetKeyProperties(Type boType) { - FieldInfo[] allKeyFields = BoMapper.GetAnnotatedFields(boType, typeof(BoKey)); - if (allKeyFields.Length == 0) + var allKeyProperties = boType.GetProperties() + .Where(p => p.GetCustomAttributes(typeof(BoKey), false).Length > 0) + .OrderBy(af => af.GetCustomAttribute()?.Order) + .ToArray(); + if (allKeyProperties.Length == 0) { throw new NotImplementedException($"Business Object {boType.Name} has no [BoKey] defined => can't create URI."); } - IList ownKeyFields = new List(); + IList ownKeyProps = new List(); bool ignoreInheritedFields = false; // default - foreach (FieldInfo keyField in allKeyFields) + foreach (var keyProp in allKeyProperties) { - if (keyField.DeclaringType == boType - && keyField.GetCustomAttribute().IgnoreInheritedKeys) + if (keyProp.DeclaringType == boType + && keyProp.GetCustomAttribute().IgnoreInheritedKeys) { ignoreInheritedFields = true; - ownKeyFields.Add(keyField); + ownKeyProps.Add(keyProp); } } if (ignoreInheritedFields) { - return ownKeyFields; + return ownKeyProps; } else { - return allKeyFields.ToList(); + return allKeyProperties.ToList(); } } @@ -279,13 +284,13 @@ public JObject GetQueryObject(Type boType = null, int i = 0) // business objects is the same as the order of the BO key values encoded in the URI // path segments. - foreach (FieldInfo keyField in GetKeyFields(boType)) + foreach (PropertyInfo keyProp in GetKeyProperties(boType)) { - string keyFieldName = keyField.Name; - JsonPropertyAttribute jpa = keyField.GetCustomAttribute(); + string keyPropName = keyProp.Name; + JsonPropertyAttribute jpa = keyProp.GetCustomAttribute(); if (jpa != null && jpa.PropertyName != null) { - keyFieldName = jpa.PropertyName; + keyPropName = jpa.PropertyName; } string keyValue; try @@ -300,18 +305,18 @@ public JObject GetQueryObject(Type boType = null, int i = 0) { keyValue = keyValue.Substring(0, keyValue.Length - 1); } - if (keyField.FieldType == typeof(string)) + if (keyProp.PropertyType == typeof(string)) { if (keyValue == NULL_KEY_PLACEHOLDER) { - result.Add(keyFieldName, null); + result.Add(keyPropName, null); } else { - result.Add(keyFieldName, keyValue); + result.Add(keyPropName, keyValue); } } - else if (keyField.FieldType == typeof(int)) + else if (keyProp.PropertyType == typeof(int)) { /*if (keyField.FieldType.IsEnum) { @@ -321,32 +326,32 @@ public JObject GetQueryObject(Type boType = null, int i = 0) else*/ if (Int32.TryParse(keyValue, out int keyValueInt)) { - result.Add(keyFieldName, keyValueInt); + result.Add(keyPropName, keyValueInt); } else { - throw new ArgumentException($"Key segment {keyFieldName} could not be parsed as int although an integer type was expected!"); + throw new ArgumentException($"Key segment {keyPropName} could not be parsed as int although an integer type was expected!"); } } - else if (keyField.FieldType.IsSubclassOf(typeof(BusinessObject))) + else if (keyProp.PropertyType.IsSubclassOf(typeof(BusinessObject))) { - JObject subresult = GetQueryObject(keyField.FieldType, i - 1); - result.Add(keyFieldName, subresult); + JObject subresult = GetQueryObject(keyProp.PropertyType, i - 1); + result.Add(keyPropName, subresult); } else { - throw new NotImplementedException($"Using {keyField.FieldType} as [BoKey] is not supported yet."); + throw new NotImplementedException($"Using {keyProp.PropertyType} as [BoKey] is not supported yet."); } } var query = System.Web.HttpUtility.ParseQueryString(this.Query); - var boFields = this.GetBoType().GetFields().Select(f => f.Name); + var boProps = this.GetBoType().GetProperties().Select(p => p.Name); if (query.AllKeys.Contains("filter")) // currently this pattern only supports AND concatenation, not OR. result should contain multiple JObjects { string filter = query.Get("filter"); foreach (Match match in FILTER_AND_PATTERN.Matches(filter)) { - if (boFields.Contains(match.Groups["key"].Value)) + if (boProps.Contains(match.Groups["key"].Value, StringComparer.OrdinalIgnoreCase)) { result[match.Groups["key"].Value] = match.Groups["value"].Value; } @@ -363,9 +368,9 @@ public Bo4eUri AddFilter(IDictionary filterObject) { NameValueCollection query = System.Web.HttpUtility.ParseQueryString(this.Query); string filterString = string.Empty; - var boFields = this.GetBoType().GetFields().Select(f => f.Name); + var boFields = this.GetBoType().GetProperties().Select(p => p.Name); string andString = " and "; - foreach (var kvp in filterObject.Where(kvp => kvp.Value != null && boFields.Contains(kvp.Key))) + foreach (var kvp in filterObject.Where(kvp => kvp.Value != null && boFields.Contains(kvp.Key, StringComparer.OrdinalIgnoreCase))) { filterString += $"{andString}{kvp.Key} eq '{kvp.Value}'"; } diff --git a/BO4E-dotnet/meta/DataCategory.cs b/BO4E-dotnet/meta/DataCategory.cs index 24c4b393..64caeff2 100644 --- a/BO4E-dotnet/meta/DataCategory.cs +++ b/BO4E-dotnet/meta/DataCategory.cs @@ -35,7 +35,7 @@ public enum DataCategory /// POD, /// - /// the might be handled separately with this DataCategory + /// the might be handled separately with this DataCategory /// USER_PROPERTIES, } diff --git a/BO4E-dotnet/meta/LenientConverters/LenientBo4eUriConverter.cs b/BO4E-dotnet/meta/LenientConverters/LenientBo4eUriConverter.cs new file mode 100644 index 00000000..1782d2cc --- /dev/null +++ b/BO4E-dotnet/meta/LenientConverters/LenientBo4eUriConverter.cs @@ -0,0 +1,38 @@ +using System; + +using Newtonsoft.Json; + +namespace BO4E.meta.LenientConverters +{ + public class LenientBo4eUriConverter : JsonConverter + { + public override bool CanConvert(Type objectType) + { + return (objectType == typeof(Bo4eUri)); + } + + public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) + { + if (reader.Value == null) + { + return null; + } + string rawString = (string)reader.Value; + if (rawString.Trim() == String.Empty) + { + return null; + } + return new Bo4eUri(rawString); + } + + public override bool CanWrite + { + get { return false; } + } + + public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) + { + throw new NotImplementedException(); + } + } +} diff --git a/BO4E-dotnet/meta/LenientConverters/LenientDateTimeConverter.cs b/BO4E-dotnet/meta/LenientConverters/LenientDateTimeConverter.cs new file mode 100644 index 00000000..b74e64c3 --- /dev/null +++ b/BO4E-dotnet/meta/LenientConverters/LenientDateTimeConverter.cs @@ -0,0 +1,99 @@ +using System; +using System.Collections.Generic; +using System.Globalization; + +using Newtonsoft.Json; + +namespace BO4E.meta.LenientConverters +{ + /// + /// The lenient DateTimeConverter allows for transforming strings into (nullable) DateTime(?) objects, + /// even if their formatting is somehow weird. + /// + public class LenientDateTimeConverter : JsonConverter + { + // basic structure copied from https://stackoverflow.com/a/33172735/10009545 + + private readonly DateTime? _defaultDateTime; + + public LenientDateTimeConverter(DateTime? defaultDateTime = null) + { + this._defaultDateTime = defaultDateTime; + } + + public LenientDateTimeConverter() : this(null) + { + + } + + private readonly List ALLOWED_DATETIME_FORMATS = new List() + { + "yyyyMMddHHmm", + "yyyyMMddHHmmss", + @"yyyyMMddHHmmss'--T::zzzz'", // ToDo: remove again. this is just a buggy, nasty workaround + }; + + public override bool CanConvert(Type objectType) + { + return (objectType == typeof(DateTime) || objectType == typeof(DateTime?)); + } + + public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) + { + string rawDate; + if (reader.Value == null) + { + return null; + } + else if (reader.Value as string != null) + { + rawDate = (string)reader.Value; + } + else if (reader.Value.GetType() == typeof(DateTime)) + { + return (DateTime)reader.Value; + } + else + { + rawDate = reader.Value.ToString(); + } + // First try to parse the date string as is (in case it is correctly formatted) + if (DateTime.TryParse(rawDate, out DateTime date)) + { + return date; + } + + foreach (string dtf in ALLOWED_DATETIME_FORMATS) + { + if (DateTime.TryParseExact(rawDate, dtf, CultureInfo.InvariantCulture, DateTimeStyles.None, out date)) + { + return date; + } + } + + // It's not a date after all, so just return the default value + if (objectType == typeof(DateTime?)) + { + return null; + } + if (this._defaultDateTime.HasValue) + { + return _defaultDateTime; + } + else + { + throw new JsonReaderException($"Couldn't convert {rawDate} to any of the allowed date time formats: {String.Join(";", ALLOWED_DATETIME_FORMATS)})"); + } + } + + public override bool CanWrite + { + get { return false; } + } + + public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) + { + throw new NotImplementedException(); + } + } +} \ No newline at end of file diff --git a/BO4E-dotnet/meta/LenientConverters/LenientEnumListConverter.cs b/BO4E-dotnet/meta/LenientConverters/LenientEnumListConverter.cs new file mode 100644 index 00000000..b086c068 --- /dev/null +++ b/BO4E-dotnet/meta/LenientConverters/LenientEnumListConverter.cs @@ -0,0 +1,72 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; + +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; + +namespace BO4E.meta.LenientConverters +{ + public class LenientEnumListConverter : JsonConverter + { + public override bool CanConvert(Type objectType) + { + if (!objectType.IsGenericType) + { + return false; + } + if (objectType.GetGenericTypeDefinition() != typeof(List<>)) + { + return false; + } + Type expectedListElementType = objectType.GetGenericArguments()[0]; + return expectedListElementType.ToString().StartsWith("BO4E.ENUM"); + } + + public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) + { + JToken token = JToken.Load(reader); // https://stackoverflow.com/a/47864946/10009545 + List rawList = token.ToObject>(); + Type expectedListElementType = objectType.GetGenericArguments()[0]; + Type expectedListType = typeof(List<>).MakeGenericType(expectedListElementType); + object result = Activator.CreateInstance(expectedListType); + if (rawList == null || rawList.Count == 0) + { + return result; + } + // First try to parse the List normally, in case it's formatted as expected + foreach (var rawItem in rawList) + { + if (rawItem.GetType() == typeof(string) && Enum.IsDefined(expectedListElementType, rawItem.ToString())) + { + // default. everything is as it should be :-) + object enumValue = Enum.Parse(expectedListElementType, rawItem.ToString()); + ((IList)result).Add(enumValue); + } + else if (rawItem.GetType() == typeof(JObject)) + { + Dictionary rawDict = ((JObject)rawItem).ToObject>(); + object rawObject = rawDict.Values.FirstOrDefault(); + object enumValue = Enum.Parse(expectedListElementType, rawObject.ToString()); + ((IList)result).Add(enumValue); + } + else + { + ((IList)result).Add(rawItem); + } + } + return result; + } + + public override bool CanWrite + { + get { return false; } + } + + public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) + { + throw new NotImplementedException(); + } + } +} \ No newline at end of file diff --git a/BO4E-dotnet/meta/LenientConverters/LenientJsonSerializerSettingsGenerator.cs b/BO4E-dotnet/meta/LenientConverters/LenientJsonSerializerSettingsGenerator.cs new file mode 100644 index 00000000..c89d077d --- /dev/null +++ b/BO4E-dotnet/meta/LenientConverters/LenientJsonSerializerSettingsGenerator.cs @@ -0,0 +1,81 @@ +using System; +using System.Collections.Generic; + +using Newtonsoft.Json; +using Newtonsoft.Json.Serialization; + +namespace BO4E.meta.LenientConverters +{ + public static class LenientParsingExtensions + { + /// + /// + /// + public static JsonSerializerSettings GetJsonSerializerSettings(this LenientParsing lenient) + { + return GetJsonSerializerSettings(lenient, new HashSet()); + } + + /// + /// Generates JsonSerializerSettings for given lenient parsing setting + /// + /// + /// + /// + public static JsonSerializerSettings GetJsonSerializerSettings(this LenientParsing lenient, HashSet userPropertiesWhiteList) + { + List converters = new List(); + foreach (LenientParsing lp in Enum.GetValues(typeof(LenientParsing))) + { + if (lenient.HasFlag(lp)) + { + switch (lp) + { + case LenientParsing.DateTime: + if (!lenient.HasFlag(LenientParsing.SetInitialDateIfNull)) + { + converters.Add(new LenientDateTimeConverter()); + } + else + { + converters.Add(new LenientDateTimeConverter(new DateTime())); + } + break; + case LenientParsing.EnumList: + converters.Add(new LenientEnumListConverter()); + break; + case LenientParsing.Bo4eUri: + converters.Add(new LenientBo4eUriConverter()); + break; + case LenientParsing.StringToInt: + converters.Add(new LenientStringToIntConverter()); + break; + // case LenientParsing.EmptyLists: + // converters.Add(new LenientRequiredListConverter()); + // break; + + // no default case because NONE and MOST_LENIENT do not come up with more converters + } + } + } + IContractResolver contractResolver; + if (userPropertiesWhiteList.Count > 0) + { + contractResolver = new UserPropertiesDataContractResolver(userPropertiesWhiteList); + } + else + { + contractResolver = new DefaultContractResolver(); + } + JsonSerializerSettings settings = new JsonSerializerSettings + { + Converters = converters, + DateParseHandling = DateParseHandling.None, + ContractResolver = contractResolver + }; + return settings; + } + } +} diff --git a/BO4E-dotnet/LenientParsing.cs b/BO4E-dotnet/meta/LenientConverters/LenientParsing.cs similarity index 88% rename from BO4E-dotnet/LenientParsing.cs rename to BO4E-dotnet/meta/LenientConverters/LenientParsing.cs index 75577dcb..bf8acba8 100644 --- a/BO4E-dotnet/LenientParsing.cs +++ b/BO4E-dotnet/meta/LenientConverters/LenientParsing.cs @@ -1,6 +1,6 @@ using System; -namespace BO4E +namespace BO4E.meta.LenientConverters { /// /// Passing LenientParsing flags to allows you to map such JSONs that @@ -35,6 +35,10 @@ public enum LenientParsing /// SetInitialDateIfNull = 8, /// + /// Try to parse Strings as Integer if type doesn't fit + /// + StringToInt = 16, + /// /// most lenient (all others) /// MOST_LENIENT = ~0 diff --git a/BO4E-dotnet/meta/LenientConverters/LenientStringToIntConverter.cs b/BO4E-dotnet/meta/LenientConverters/LenientStringToIntConverter.cs new file mode 100644 index 00000000..7c2ddbe2 --- /dev/null +++ b/BO4E-dotnet/meta/LenientConverters/LenientStringToIntConverter.cs @@ -0,0 +1,53 @@ +using System; +using System.Linq; + +using Newtonsoft.Json; + +namespace BO4E.meta.LenientConverters +{ + /// + /// The lenient StringToIntConverter allows for int or int? objects have alphabetic characters. + /// If the string is not parsable as integer 0 is used in case of (int) and null in case of (int?). + /// + /// (string)"12" will be parsed as (int)12 where an integer value is expected. + public class LenientStringToIntConverter : JsonConverter + { + public override bool CanConvert(Type objectType) + { + return (objectType == typeof(int) || objectType == typeof(int?)); + } + + public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) + { + if (reader.Value == null) + { + return null; + } + string numeric = new String(reader.Value.ToString().Where(Char.IsDigit).ToArray()); + if (int.TryParse(numeric, out int intValue)) + { + return intValue; + } + else + { + if (objectType == typeof(int?)) + { + return null; + } + else + { + return 0; + } + } + } + public override bool CanWrite + { + get { return false; } + } + + public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) + { + throw new NotImplementedException(); + } + } +} diff --git a/protobuf-files/.gitkeep b/BO4E-dotnet/protobuf-files/.gitkeep similarity index 100% rename from protobuf-files/.gitkeep rename to BO4E-dotnet/protobuf-files/.gitkeep diff --git a/protobuf-files/BO4E.BO.Angebot.proto b/BO4E-dotnet/protobuf-files/BO4E.BO.Angebot.proto similarity index 62% rename from protobuf-files/BO4E.BO.Angebot.proto rename to BO4E-dotnet/protobuf-files/BO4E.BO.Angebot.proto index 36770c95..7838f75c 100644 --- a/protobuf-files/BO4E.BO.Angebot.proto +++ b/BO4E-dotnet/protobuf-files/BO4E.BO.Angebot.proto @@ -1,4 +1,4 @@ -syntax = "proto2"; +syntax = "proto3"; import "protobuf-net/bcl.proto"; // schema for protobuf-net's handling of core .NET types enum AbgabeArt { @@ -13,32 +13,32 @@ enum AbgabeArt { TSS = 8; } message Adresse { - optional string postleitzahl = 3; - optional string ort = 4; - optional string strasse = 5; - optional string hausnummer = 6; - optional string postfach = 7; - optional string adresszusatz = 8; - optional string coErgaenzung = 9; - optional Landescode landescode = 10; + string Postleitzahl = 3; + string Ort = 4; + string Strasse = 5; + string Hausnummer = 6; + string Postfach = 7; + string Adresszusatz = 8; + string CoErgaenzung = 9; + Landescode Landescode = 10; } message Angebot { - optional string angebotsnummer = 4; - optional string anfragereferenz = 5; - optional string angebotsdatum = 6; - optional Sparte sparte = 7 [default = STROM]; - optional .bcl.DateTime bindefrist = 8; - optional Geschaeftspartner angebotgeber = 9; - optional Geschaeftspartner angebotnehmer = 10; - optional Ansprechpartner unterzeichnerAngebotsnehmer = 11; - optional Ansprechpartner unterzeichnerAngebotsgeber = 12; - repeated Angebotsvariante varianten = 13; + string Angebotsnummer = 4; + string Anfragereferenz = 5; + string Angebotsdatum = 6; + Sparte Sparte = 7; + .bcl.DateTime Bindefrist = 8; + Geschaeftspartner Angebotgeber = 9; + Geschaeftspartner Angebotnehmer = 10; + Ansprechpartner UnterzeichnerAngebotsnehmer = 11; + Ansprechpartner UnterzeichnerAngebotsgeber = 12; + repeated Angebotsvariante Varianten = 13; } message Angebotsposition { - optional string positionsbezeichung = 3; - optional Menge positionsmenge = 4; - optional Preis positionspreis = 5; - optional Betrag positionsbetrag = 6; + string Positionsbezeichung = 3; + Menge Positionsmenge = 4; + Preis Positionspreis = 5; + Betrag Positionsbetrag = 6; } enum Angebotsstatus { KONZEPTION = 0; @@ -52,20 +52,20 @@ enum Angebotsstatus { ERLEDIGT = 8; } message Angebotsteil { - optional string anfrageSubreferenz = 3; - repeated Marktlokation lieferstellenangebotsteil = 4; - optional Menge gesamtmengeangebotsteil = 5; - optional Betrag gesamtkostenangebotsteil = 6; - repeated Angebotsposition positionen = 7; + string AnfrageSubreferenz = 3; + repeated Marktlokation Lieferstellenangebotsteil = 4; + Menge Gesamtmengeangebotsteil = 5; + Betrag Gesamtkostenangebotsteil = 6; + repeated Angebotsposition Positionen = 7; } message Angebotsvariante { - optional Angebotsstatus angebotsstatus = 4 [default = KONZEPTION]; - optional string beschreibung = 5; - optional .bcl.DateTime erstelldatum = 6; - optional .bcl.DateTime bindefrist = 7; - optional Menge gesamtmenge = 8; - optional Betrag gesamtkosten = 9; - repeated Angebotsteil teile = 10; + Angebotsstatus Angebotsstatus = 4; + string Beschreibung = 5; + .bcl.DateTime Erstelldatum = 6; + .bcl.DateTime Bindefrist = 7; + Menge Gesamtmenge = 8; + Betrag Gesamtkosten = 9; + repeated Angebotsteil Teile = 10; } enum Anrede { HERR = 0; @@ -76,17 +76,17 @@ enum Anrede { DR = 5; } message Ansprechpartner { - optional Anrede anrede = 4; - optional string individuelleAnrede = 5; - optional Titel titel = 6; - optional string vorname = 7; - optional string nachname = 8; - optional string eMailAdresse = 9; - optional string kommentar = 10; - optional Geschaeftspartner geschaeftspartner = 11; - optional Adresse adresse = 12; - repeated Rufnummer rufnummer = 13; - repeated Zustaendigkeit zustaendigkeit = 14; + Anrede Anrede = 4; + string IndividuelleAnrede = 5; + Titel Titel = 6; + string Vorname = 7; + string Nachname = 8; + string EMailAdresse = 9; + string Kommentar = 10; + Geschaeftspartner Geschaeftspartner = 11; + Adresse Adresse = 12; + repeated Rufnummer Rufnummer = 13; + repeated Zustaendigkeit Zustaendigkeit = 14; } enum ArithmetischeOperation { ADDITION = 0; @@ -95,8 +95,8 @@ enum ArithmetischeOperation { DIVISION = 3; } message Betrag { - optional .bcl.Decimal wert = 3 [default = 0]; - optional Waehrungscode waehrung = 4 [default = AFN]; + .bcl.Decimal Wert = 3; + Waehrungscode Waehrung = 4; } enum Bilanzierungsmethode { RLM = 0; @@ -107,8 +107,8 @@ enum Bilanzierungsmethode { IMS = 5; } message Dienstleistung { - optional Dienstleistungstyp dienstleistungstyp = 3 [default = DATENBEREITSTELLUNG_TAEGLICH]; - optional string bezeichnung = 4; + Dienstleistungstyp Dienstleistungstyp = 3; + string Bezeichnung = 4; } enum Dienstleistungstyp { DATENBEREITSTELLUNG_TAEGLICH = 0; @@ -161,9 +161,10 @@ enum Fernschaltung { } enum Gasqualitaet { option allow_alias = true; + ZERO = 0; // proto3 requires a zero value as the first item (it can be named anything) H_GAS = 1; - HGAS = 1; L_GAS = 2; + HGAS = 1; LGAS = 2; } enum Gebiettyp { @@ -178,13 +179,13 @@ enum Gebiettyp { VERSORGUNGSGEBIET = 8; } message Geokoordinaten { - optional .bcl.Decimal breitengrad = 3 [default = 0]; - optional .bcl.Decimal laengengrad = 4 [default = 0]; + .bcl.Decimal Breitengrad = 3; + .bcl.Decimal Laengengrad = 4; } message Geraeteeigenschaften { - optional Geraetetyp geraetetyp = 3 [default = WECHSELSTROMZAEHLER]; - optional Geraetemerkmal geraetemerkmal = 4; - map parameter = 1005; + Geraetetyp Geraetetyp = 3; + Geraetemerkmal Geraetemerkmal = 4; + map Parameter = 1005; } enum Geraetemerkmal { EINTARIF = 0; @@ -272,21 +273,21 @@ enum Geraetetyp { KOMBIMESSWANDLER = 42; } message Geschaeftspartner { - optional Anrede anrede = 4; - optional string name1 = 6; - optional string name2 = 7; - optional string name3 = 8; - optional bool gewerbekennzeichnung = 9 [default = false]; - optional string hrnummer = 10; - optional string amtsgericht = 11; - repeated Kontaktart kontaktweg = 12; - optional string umsatzsteuerId = 13; - optional string glaeubigerId = 14; - optional string eMailAdresse = 15; - optional string website = 16; - repeated Geschaeftspartnerrolle geschaeftspartnerrolle = 17; - optional Adresse partneradresse = 18; - optional string title = 1001; + Anrede Anrede = 4; + string Name1 = 6; + string Name2 = 7; + string Name3 = 8; + bool Gewerbekennzeichnung = 9; + string Hrnummer = 10; + string Amtsgericht = 11; + repeated Kontaktart Kontaktweg = 12 [packed = false]; + string UmsatzsteuerId = 13; + string GlaeubigerId = 14; + string EMailAdresse = 15; + string Website = 16; + repeated Geschaeftspartnerrolle Geschaeftspartnerrolle = 17 [packed = false]; + Adresse Partneradresse = 18; + string Title = 1001; } enum Geschaeftspartnerrolle { LIEFERANT = 0; @@ -296,15 +297,15 @@ enum Geschaeftspartnerrolle { MARKTPARTNER = 4; } message Hardware { - optional Geraetetyp geraetetyp = 3 [default = WECHSELSTROMZAEHLER]; - optional string bezeichnung = 4; - optional Geraeteeigenschaften geraeteeigenschaften = 1005; - optional string geraetenummer = 1006; - optional string geraetereferenz = 1007; + Geraetetyp Geraetetyp = 3; + string Bezeichnung = 4; + Geraeteeigenschaften Geraeteeigenschaften = 1005; + string Geraetenummer = 1006; + string Geraetereferenz = 1007; } message Katasteradresse { - optional string gemarkung_flur = 3; - optional string flurstueck = 4; + string Gemarkung_flur = 3; + string Flurstueck = 4; } enum Kontaktart { ANSCHREIBEN = 0; @@ -314,9 +315,9 @@ enum Kontaktart { SMS = 4; } message Konzessionsabgabe { - optional AbgabeArt satz = 3 [default = KAS]; - optional .bcl.Decimal kosten = 4 [default = 0]; - optional string kategorie = 5; + AbgabeArt Satz = 3; + .bcl.Decimal Kosten = 4; + string Kategorie = 5; } enum Landescode { AC = 0; @@ -588,31 +589,31 @@ enum Landescode { ZW = 266; } message Marktlokation { - optional string marktlokationsId = 4 [default = "|null|"]; - optional Sparte sparte = 5 [default = STROM]; - optional Energierichtung energierichtung = 6 [default = AUSSP]; - optional Bilanzierungsmethode bilanzierungsmethode = 7 [default = RLM]; - optional Verbrauchsart verbrauchsart = 8; - optional bool unterbrechbar = 9; - optional Netzebene netzebene = 10 [default = NSP]; - optional string netzbetreibercodenr = 11; - optional Gebiettyp gebiettyp = 12; - optional string netzgebietnr = 13; - optional string bilanzierungsgebiet = 14; - optional string grundversorgercodenr = 15; - optional Gasqualitaet gasqualitaet = 16; - optional Geschaeftspartner endkunde = 17; - optional Adresse lokationsadresse = 18; - optional Geokoordinaten geoadresse = 19; - optional Katasteradresse katasterinformation = 20; - repeated Messlokationszuordnung zugehoerigeMesslokationen = 28; - repeated Marktrolle marktrollen = 1021; - optional string regelzone = 1022; - optional string marktgebiet = 1023; - optional Zeitreihentyp zeitreihentyp = 1024; - repeated Zaehlwerk zaehlwerke = 1025; - repeated Verbrauch verbauchsmenge = 1026; - repeated Messlokation messlokationen = 1027; + string MarktlokationsId = 4; // default value could not be applied: |null| + Sparte Sparte = 5; + Energierichtung Energierichtung = 6; + Bilanzierungsmethode Bilanzierungsmethode = 7; + Verbrauchsart Verbrauchsart = 8; + bool Unterbrechbar = 9; + Netzebene Netzebene = 10; + string NetzbetreiberCodeNr = 11; + Gebiettyp GebietType = 12; + string NetzgebietNr = 13; + string Bilanzierungsgebiet = 14; + string GrundversorgerCodeNr = 15; + Gasqualitaet Gasqualitaet = 16; + Geschaeftspartner Endkunde = 17; + Adresse Lokationsadresse = 18; + Geokoordinaten Geoadresse = 19; + Katasteradresse Katasterinformation = 20; + repeated Messlokationszuordnung ZugehoerigeMesslokationen = 28; + repeated Marktrolle Marktrollen = 1021; + string Regelzone = 1022; + string Marktgebiet = 1023; + Zeitreihentyp Zeitreihentyp = 1024; + repeated Zaehlwerk Zaehlwerke = 1025; + repeated Verbrauch Verbrauchsmenge = 1026; + repeated Messlokation Messlokationen = 1027; } enum Marktrolle { NB = 0; @@ -631,56 +632,57 @@ enum Marktrolle { INTERESSENT = 13; } message Marktrolle { - optional string rollencodenummer = 3; - optional string code = 4; - optional Marktrolle marktrolle = 5 [default = NB]; + string Rollencodenummer = 3; + string Code = 4; + Marktrolle marktrolle = 5; } message Menge { - optional .bcl.Decimal wert = 3 [default = 0]; - optional Mengeneinheit einheit = 4 [default = 0]; + .bcl.Decimal Wert = 3; + Mengeneinheit Einheit = 4; } enum Mengeneinheit { + ZERO = 0; // proto3 requires a zero value as the first item (it can be named anything) WH = 2; KW = 3; + KWH = 2000; + MW = 3000; + MWH = 2000000; ANZAHL = 7; KUBIKMETER = 11; STUNDE = 13; TAG = 17; MONAT = 19; - VAR = 23; - VARH = 29; JAHR = 228; - KWH = 2000; - MW = 3000; + VAR = 23; KVAR = 23000; + VARH = 29; KVARH = 29000; - MWH = 2000000; } message Messlokation { - optional string messlokationsId = 4 [default = "|null|"]; - optional Sparte sparte = 5 [default = STROM]; - optional Netzebene netzebeneMessung = 6; - optional string messgebietNr = 7; - optional string grundzustaendigerMSBCodeNr = 8; - optional string grundzustaendigerMSBIMCodeNr = 9; - optional string grundzustaendigerMDLCodeNr = 10; - optional Adresse messadresse = 11; - optional Geokoordinaten geoadresse = 12; - optional Katasteradresse katasterinformation = 13; - repeated Hardware geraete = 14; - repeated Dienstleistung messdienstleistung = 15; - repeated Zaehler messlokationszaehler = 16; - optional Bilanzierungsmethode bilanzierungsmethode = 17; - optional bool abrechnungmessstellenbetriebnna = 1018; - repeated Marktrolle marktrollen = 1019; - optional Gasqualitaet gasqualitaet = 1020; - optional .bcl.Decimal verlustfaktor = 1021; + string MesslokationsId = 4; // default value could not be applied: |null| + Sparte Sparte = 5; + Netzebene NetzebeneMessung = 6; + string MessgebietNr = 7; + string GrundzustaendigerMSBCodeNr = 8; + string GrundzustaendigerMSBIMCodeNr = 9; + string GrundzustaendigerMDLCodeNr = 10; + Adresse Messadresse = 11; + Geokoordinaten Geoadresse = 12; + Katasteradresse Katasterinformation = 13; + repeated Hardware Geraete = 14; + repeated Dienstleistung Messdienstleistung = 15; + repeated Zaehler Messlokationszaehler = 16; + Bilanzierungsmethode Bilanzierungsmethode = 17; + bool Abrechnungmessstellenbetriebnna = 1018; + repeated Marktrolle Marktrollen = 1019; + Gasqualitaet Gasqualitaet = 1020; + .bcl.Decimal Verlustfaktor = 1021; } message Messlokationszuordnung { - optional string messlokationsId = 3; - optional ArithmetischeOperation arithmetik = 4; - optional .bcl.DateTime gueltigSeit = 5; - optional .bcl.DateTime gueltigBis = 6; + string MesslokationsId = 3; + ArithmetischeOperation Arithmetik = 4; + .bcl.DateTime GueltigSeit = 5; + .bcl.DateTime GueltigBis = 6; } enum Messwerterfassung { FERNAUSLESBAR = 0; @@ -699,18 +701,18 @@ enum Netzebene { ND = 9; } message Preis { - optional .bcl.Decimal wert = 3 [default = 0]; - optional Waehrungseinheit einheit = 4 [default = EUR]; - optional Mengeneinheit bezugswert = 5 [default = 0]; - optional Preisstatus status = 6; + .bcl.Decimal Wert = 3; + Waehrungseinheit Einheit = 4; + Mengeneinheit Bezugswert = 5; + Preisstatus Status = 6; } enum Preisstatus { VORLAEUFIG = 0; ENDGUELTIG = 1; } message Rufnummer { - optional Rufnummernart nummerntyp = 3 [default = RUF_ZENTRALE]; - optional string rufnummer = 4; + Rufnummernart Nummerntyp = 3; + string rufnummer = 4; } enum Rufnummernart { RUF_ZENTRALE = 0; @@ -752,13 +754,13 @@ enum Unterbrechbarkeit { NUV = 1; } message Verbrauch { - optional .bcl.DateTime startdatum = 3; - optional .bcl.DateTime enddatum = 4; - optional Wertermittlungsverfahren wertermittlungsverfahren = 5 [default = PROGNOSE]; - optional string obiskennzahl = 6; - optional .bcl.Decimal wert = 7 [default = 0]; - optional Mengeneinheit einheit = 8 [default = 0]; - optional Verbrauchsmengetyp type = 9; + .bcl.DateTime Startdatum = 3; + .bcl.DateTime Enddatum = 4; + Wertermittlungsverfahren Wertermittlungsverfahren = 5; + string Obiskennzahl = 6; + .bcl.Decimal Wert = 7; + Mengeneinheit Einheit = 8; + Verbrauchsmengetyp Type = 9; } enum Verbrauchsart { KL = 0; @@ -975,19 +977,19 @@ enum Wertermittlungsverfahren { MESSUNG = 1; } message Zaehler { - optional string zaehlernummer = 4; - optional Sparte sparte = 5 [default = STROM]; - optional Zaehlerauspraegung zaehlerauspraegung = 6 [default = EINRICHTUNGSZAEHLER]; - optional Zaehlertyp zaehlertyp = 7 [default = DREHSTROMZAEHLER]; - optional Tarifart tarifart = 8 [default = EINTARIF]; - optional .bcl.Decimal zaehlerkonstante = 9 [default = 0]; - optional .bcl.DateTime eichungBis = 10; - optional .bcl.DateTime letzteEichung = 11; - repeated Zaehlwerk zaehlwerke = 12; - optional Geschaeftspartner zaehlerhersteller = 13; - optional string gateway = 1014; - optional Fernschaltung fernschaltung = 1015; - optional Messwerterfassung messwerterfassung = 1016; + string Zaehlernummer = 4; + Sparte Sparte = 5; + Zaehlerauspraegung Zaehlerauspraegung = 6; + Zaehlertyp Zaehlertyp = 7; + Tarifart Tarifart = 8; + .bcl.Decimal zaehlerkonstante = 9; + .bcl.DateTime EichungBis = 10; + .bcl.DateTime LetzteEichung = 11; + repeated Zaehlwerk Zaehlwerke = 12; + Geschaeftspartner Zaehlerhersteller = 13; + string Gateway = 1014; + Fernschaltung Fernschaltung = 1015; + Messwerterfassung Messwerterfassung = 1016; } enum Zaehlerauspraegung { EINRICHTUNGSZAEHLER = 0; @@ -1005,22 +1007,22 @@ enum Zaehlertyp { WECHSELSTROMZAEHLER = 8; } message Zaehlwerk { - optional string zaehlwerkId = 3; - optional string bezeichnung = 4; - optional Energierichtung richtung = 5 [default = AUSSP]; - optional string obisKennzahl = 6; - optional .bcl.Decimal wandlerfaktor = 7 [default = 0]; - optional Mengeneinheit einheit = 8 [default = 0]; - optional string kennzahl = 1009; - optional Schwachlastfaehig schwachlastfaehig = 1010; - repeated Verwendungszweck verwendungszwecke = 1011; - optional Verbrauchsart verbrauchsart = 1012; - optional Unterbrechbarkeit unterbrechbarkeit = 1013; - optional Waermenutzung waermenutzung = 1014; - optional Konzessionsabgabe konzessionsabgabe = 1015; - optional bool steuerbefreit = 1016; - optional int32 vorkommastelle = 1017; - optional int32 nachkommastelle = 1018; + string ZaehlwerkId = 3; + string Bezeichnung = 4; + Energierichtung Richtung = 5; + string ObisKennzahl = 6; + .bcl.Decimal Wandlerfaktor = 7; + Mengeneinheit Einheit = 8; + string Kennzahl = 1009; + Schwachlastfaehig Schwachlastfaehig = 1010; + repeated Verwendungszweck Verwendungszwecke = 1011 [packed = false]; + Verbrauchsart Verbrauchsart = 1012; + Unterbrechbarkeit Unterbrechbarkeit = 1013; + Waermenutzung Waermenutzung = 1014; + Konzessionsabgabe Konzessionsabgabe = 1015; + bool Steuerbefreit = 1016; + int32 Vorkommastelle = 1017; + int32 Nachkommastelle = 1018; } enum Zeitreihentyp { EGS = 0; @@ -1032,7 +1034,7 @@ enum Zeitreihentyp { TLS = 6; } message Zustaendigkeit { - optional string jobtitel = 3; - optional string abteilung = 4; - optional string themengebiet = 5; + string Jobtitel = 3; + string Abteilung = 4; + string Themengebiet = 5; } diff --git a/protobuf-files/BO4E.BO.Ansprechpartner.proto b/BO4E-dotnet/protobuf-files/BO4E.BO.Ansprechpartner.proto similarity index 73% rename from protobuf-files/BO4E.BO.Ansprechpartner.proto rename to BO4E-dotnet/protobuf-files/BO4E.BO.Ansprechpartner.proto index 78878db6..253c2b00 100644 --- a/protobuf-files/BO4E.BO.Ansprechpartner.proto +++ b/BO4E-dotnet/protobuf-files/BO4E.BO.Ansprechpartner.proto @@ -1,14 +1,14 @@ -syntax = "proto2"; +syntax = "proto3"; message Adresse { - optional string postleitzahl = 3; - optional string ort = 4; - optional string strasse = 5; - optional string hausnummer = 6; - optional string postfach = 7; - optional string adresszusatz = 8; - optional string coErgaenzung = 9; - optional Landescode landescode = 10; + string Postleitzahl = 3; + string Ort = 4; + string Strasse = 5; + string Hausnummer = 6; + string Postfach = 7; + string Adresszusatz = 8; + string CoErgaenzung = 9; + Landescode Landescode = 10; } enum Anrede { HERR = 0; @@ -19,34 +19,34 @@ enum Anrede { DR = 5; } message Ansprechpartner { - optional Anrede anrede = 4; - optional string individuelleAnrede = 5; - optional Titel titel = 6; - optional string vorname = 7; - optional string nachname = 8; - optional string eMailAdresse = 9; - optional string kommentar = 10; - optional Geschaeftspartner geschaeftspartner = 11; - optional Adresse adresse = 12; - repeated Rufnummer rufnummer = 13; - repeated Zustaendigkeit zustaendigkeit = 14; + Anrede Anrede = 4; + string IndividuelleAnrede = 5; + Titel Titel = 6; + string Vorname = 7; + string Nachname = 8; + string EMailAdresse = 9; + string Kommentar = 10; + Geschaeftspartner Geschaeftspartner = 11; + Adresse Adresse = 12; + repeated Rufnummer Rufnummer = 13; + repeated Zustaendigkeit Zustaendigkeit = 14; } message Geschaeftspartner { - optional Anrede anrede = 4; - optional string name1 = 6; - optional string name2 = 7; - optional string name3 = 8; - optional bool gewerbekennzeichnung = 9 [default = false]; - optional string hrnummer = 10; - optional string amtsgericht = 11; - repeated Kontaktart kontaktweg = 12; - optional string umsatzsteuerId = 13; - optional string glaeubigerId = 14; - optional string eMailAdresse = 15; - optional string website = 16; - repeated Geschaeftspartnerrolle geschaeftspartnerrolle = 17; - optional Adresse partneradresse = 18; - optional string title = 1001; + Anrede Anrede = 4; + string Name1 = 6; + string Name2 = 7; + string Name3 = 8; + bool Gewerbekennzeichnung = 9; + string Hrnummer = 10; + string Amtsgericht = 11; + repeated Kontaktart Kontaktweg = 12 [packed = false]; + string UmsatzsteuerId = 13; + string GlaeubigerId = 14; + string EMailAdresse = 15; + string Website = 16; + repeated Geschaeftspartnerrolle Geschaeftspartnerrolle = 17 [packed = false]; + Adresse Partneradresse = 18; + string Title = 1001; } enum Geschaeftspartnerrolle { LIEFERANT = 0; @@ -332,8 +332,8 @@ enum Landescode { ZW = 266; } message Rufnummer { - optional Rufnummernart nummerntyp = 3 [default = RUF_ZENTRALE]; - optional string rufnummer = 4; + Rufnummernart Nummerntyp = 3; + string rufnummer = 4; } enum Rufnummernart { RUF_ZENTRALE = 0; @@ -352,7 +352,7 @@ enum Titel { PROF_DR = 2; } message Zustaendigkeit { - optional string jobtitel = 3; - optional string abteilung = 4; - optional string themengebiet = 5; + string Jobtitel = 3; + string Abteilung = 4; + string Themengebiet = 5; } diff --git a/BO4E-dotnet/protobuf-files/BO4E.BO.Benachrichtigung.proto b/BO4E-dotnet/protobuf-files/BO4E.BO.Benachrichtigung.proto new file mode 100644 index 00000000..c89210d8 --- /dev/null +++ b/BO4E-dotnet/protobuf-files/BO4E.BO.Benachrichtigung.proto @@ -0,0 +1,48 @@ +syntax = "proto3"; +import "protobuf-net/bcl.proto"; // schema for protobuf-net's handling of core .NET types + +message Aufgabe { + string AufgabenId = 3; + string Beschreibung = 4; + .bcl.DateTime Deadline = 5; + bool Ausgefuehrt = 6; + .bcl.DateTime Ausfuehrungszeitpunkt = 7; + string Ausfuehrender = 8; +} +enum Bearbeitungsstatus { + OFFEN = 0; + IN_BEARBEITUNG = 1; + ABGESCHLOSSEN = 2; + STORNIERT = 3; + QUITTIERT = 4; + IGNORIERT = 5; +} +message Benachrichtigung { + string BenachrichtigungsId = 4; + Prioritaet Prioritaet = 5; // default value could not be applied: NORMAL + Bearbeitungsstatus Bearbeitungsstatus = 6; + string Kurztext = 7; + .bcl.DateTime ErstellungsZeitpunkt = 8; + string Kategorie = 9; + string Bearbeiter = 10; + repeated Notiz Notizen = 11; + .bcl.DateTime Deadline = 12; + repeated Aufgabe Aufgaben = 13; + repeated GenericStringStringInfo Infos = 14; +} +message GenericStringStringInfo { + string KeyColumn = 3; + string Value = 4; +} +message Notiz { + string Autor = 3; + .bcl.DateTime Zeitpunkt = 4; + string Inhalt = 5; +} +enum Prioritaet { + SEHR_NIEDRIG = 0; + NIEDRIG = 1; + NORMAL = 2; + HOCH = 3; + SEHR_HOCH = 4; +} diff --git a/protobuf-files/BO4E.BO.Energiemenge.proto b/BO4E-dotnet/protobuf-files/BO4E.BO.Energiemenge.proto similarity index 54% rename from protobuf-files/BO4E.BO.Energiemenge.proto rename to BO4E-dotnet/protobuf-files/BO4E.BO.Energiemenge.proto index 1b32a28b..3b60bdb9 100644 --- a/protobuf-files/BO4E.BO.Energiemenge.proto +++ b/BO4E-dotnet/protobuf-files/BO4E.BO.Energiemenge.proto @@ -1,40 +1,41 @@ -syntax = "proto2"; +syntax = "proto3"; import "protobuf-net/bcl.proto"; // schema for protobuf-net's handling of core .NET types message Energiemenge { - optional string lokationsId = 4 [default = "|null|"]; - optional Lokationstyp lokationstyp = 5 [default = MaLo]; - repeated Verbrauch energieverbrauch = 6; + string LokationsId = 4; // default value could not be applied: |null| + Lokationstyp LokationsTyp = 5; + repeated Verbrauch Energieverbrauch = 6; } enum Lokationstyp { MaLo = 0; MeLo = 1; } enum Mengeneinheit { + ZERO = 0; // proto3 requires a zero value as the first item (it can be named anything) WH = 2; KW = 3; + KWH = 2000; + MW = 3000; + MWH = 2000000; ANZAHL = 7; KUBIKMETER = 11; STUNDE = 13; TAG = 17; MONAT = 19; - VAR = 23; - VARH = 29; JAHR = 228; - KWH = 2000; - MW = 3000; + VAR = 23; KVAR = 23000; + VARH = 29; KVARH = 29000; - MWH = 2000000; } message Verbrauch { - optional .bcl.DateTime startdatum = 3; - optional .bcl.DateTime enddatum = 4; - optional Wertermittlungsverfahren wertermittlungsverfahren = 5 [default = PROGNOSE]; - optional string obiskennzahl = 6; - optional .bcl.Decimal wert = 7 [default = 0]; - optional Mengeneinheit einheit = 8 [default = 0]; - optional Verbrauchsmengetyp type = 9; + .bcl.DateTime Startdatum = 3; + .bcl.DateTime Enddatum = 4; + Wertermittlungsverfahren Wertermittlungsverfahren = 5; + string Obiskennzahl = 6; + .bcl.Decimal Wert = 7; + Mengeneinheit Einheit = 8; + Verbrauchsmengetyp Type = 9; } enum Verbrauchsmengetyp { ARBEITLEISTUNGTAGESPARAMETERABHMALO = 0; diff --git a/protobuf-files/BO4E.BO.Geschaeftspartner.proto b/BO4E-dotnet/protobuf-files/BO4E.BO.Geschaeftspartner.proto similarity index 81% rename from protobuf-files/BO4E.BO.Geschaeftspartner.proto rename to BO4E-dotnet/protobuf-files/BO4E.BO.Geschaeftspartner.proto index 87b35183..325a90f6 100644 --- a/protobuf-files/BO4E.BO.Geschaeftspartner.proto +++ b/BO4E-dotnet/protobuf-files/BO4E.BO.Geschaeftspartner.proto @@ -1,14 +1,14 @@ -syntax = "proto2"; +syntax = "proto3"; message Adresse { - optional string postleitzahl = 3; - optional string ort = 4; - optional string strasse = 5; - optional string hausnummer = 6; - optional string postfach = 7; - optional string adresszusatz = 8; - optional string coErgaenzung = 9; - optional Landescode landescode = 10; + string Postleitzahl = 3; + string Ort = 4; + string Strasse = 5; + string Hausnummer = 6; + string Postfach = 7; + string Adresszusatz = 8; + string CoErgaenzung = 9; + Landescode Landescode = 10; } enum Anrede { HERR = 0; @@ -19,21 +19,21 @@ enum Anrede { DR = 5; } message Geschaeftspartner { - optional Anrede anrede = 4; - optional string name1 = 6; - optional string name2 = 7; - optional string name3 = 8; - optional bool gewerbekennzeichnung = 9 [default = false]; - optional string hrnummer = 10; - optional string amtsgericht = 11; - repeated Kontaktart kontaktweg = 12; - optional string umsatzsteuerId = 13; - optional string glaeubigerId = 14; - optional string eMailAdresse = 15; - optional string website = 16; - repeated Geschaeftspartnerrolle geschaeftspartnerrolle = 17; - optional Adresse partneradresse = 18; - optional string title = 1001; + Anrede Anrede = 4; + string Name1 = 6; + string Name2 = 7; + string Name3 = 8; + bool Gewerbekennzeichnung = 9; + string Hrnummer = 10; + string Amtsgericht = 11; + repeated Kontaktart Kontaktweg = 12 [packed = false]; + string UmsatzsteuerId = 13; + string GlaeubigerId = 14; + string EMailAdresse = 15; + string Website = 16; + repeated Geschaeftspartnerrolle Geschaeftspartnerrolle = 17 [packed = false]; + Adresse Partneradresse = 18; + string Title = 1001; } enum Geschaeftspartnerrolle { LIEFERANT = 0; diff --git a/protobuf-files/BO4E.BO.Kosten.proto b/BO4E-dotnet/protobuf-files/BO4E.BO.Kosten.proto similarity index 70% rename from protobuf-files/BO4E.BO.Kosten.proto rename to BO4E-dotnet/protobuf-files/BO4E.BO.Kosten.proto index 69a06019..f1b10fc4 100644 --- a/protobuf-files/BO4E.BO.Kosten.proto +++ b/BO4E-dotnet/protobuf-files/BO4E.BO.Kosten.proto @@ -1,62 +1,65 @@ -syntax = "proto2"; +syntax = "proto3"; import "protobuf-net/bcl.proto"; // schema for protobuf-net's handling of core .NET types message Betrag { - optional .bcl.Decimal wert = 3 [default = 0]; - optional Waehrungscode waehrung = 4 [default = AFN]; + .bcl.Decimal Wert = 3; + Waehrungscode Waehrung = 4; } message Kosten { - optional Kostenklasse kostenklasse = 4 [default = 0]; - optional Zeitraum gueltigkeit = 5; - repeated Betrag summeKosten = 6; - repeated Kostenblock kostenbloecke = 7; - repeated Kostenposition kostenpositionen = 8; + int32 Kostenklasse = 4; // declared as invalid enum: Kostenklasse + Zeitraum Gueltigkeit = 5; + repeated Betrag SummeKosten = 6; + repeated Kostenblock Kostenbloecke = 7; + repeated Kostenposition Kostenpositionen = 8; } message Kostenblock { - optional string kostenblockbezeichnung = 3; - optional Betrag summeKostenblock = 4; - repeated Kostenposition kostenpositionen = 5; + string Kostenblockbezeichnung = 3; + Betrag SummeKostenblock = 4; + repeated Kostenposition Kostenpositionen = 5; } +/* for context only enum Kostenklasse { - // this enumeration will be passed as a raw value + ZERO = 0; // proto3 requires a zero value as the first item (it can be named anything) } +*/ message Kostenposition { - optional string positionstitel = 3; - optional .bcl.DateTime von = 4; - optional .bcl.DateTime bis = 5; - optional string artikelbezeichnung = 6; - optional string artikeldetail = 7; - optional Menge menge = 8; - optional Menge zeitmenge = 9; - optional Preis einzelpreis = 10; - optional Betrag betragKostenposition = 11; + string Positionstitel = 3; + .bcl.DateTime Von = 4; + .bcl.DateTime Bis = 5; + string Artikelbezeichnung = 6; + string Artikeldetail = 7; + Menge Menge = 8; + Menge Zeitmenge = 9; + Preis Einzelpreis = 10; + Betrag BetragKostenposition = 11; } message Menge { - optional .bcl.Decimal wert = 3 [default = 0]; - optional Mengeneinheit einheit = 4 [default = 0]; + .bcl.Decimal Wert = 3; + Mengeneinheit Einheit = 4; } enum Mengeneinheit { + ZERO = 0; // proto3 requires a zero value as the first item (it can be named anything) WH = 2; KW = 3; + KWH = 2000; + MW = 3000; + MWH = 2000000; ANZAHL = 7; KUBIKMETER = 11; STUNDE = 13; TAG = 17; MONAT = 19; - VAR = 23; - VARH = 29; JAHR = 228; - KWH = 2000; - MW = 3000; + VAR = 23; KVAR = 23000; + VARH = 29; KVARH = 29000; - MWH = 2000000; } message Preis { - optional .bcl.Decimal wert = 3 [default = 0]; - optional Waehrungseinheit einheit = 4 [default = EUR]; - optional Mengeneinheit bezugswert = 5 [default = 0]; - optional Preisstatus status = 6; + .bcl.Decimal Wert = 3; + Waehrungseinheit Einheit = 4; + Mengeneinheit Bezugswert = 5; + Preisstatus Status = 6; } enum Preisstatus { VORLAEUFIG = 0; @@ -262,8 +265,8 @@ enum Zeiteinheit { JAHR = 9; } message Zeitraum { - optional Zeiteinheit einheit = 3; - optional .bcl.Decimal dauer = 4; - optional .bcl.DateTime startdatum = 5; - optional .bcl.DateTime enddatum = 6; + Zeiteinheit Einheit = 3; + .bcl.Decimal Dauer = 4; + .bcl.DateTime Startdatum = 5; + .bcl.DateTime Enddatum = 6; } diff --git a/protobuf-files/BO4E.BO.Marktlokation.proto b/BO4E-dotnet/protobuf-files/BO4E.BO.Marktlokation.proto similarity index 64% rename from protobuf-files/BO4E.BO.Marktlokation.proto rename to BO4E-dotnet/protobuf-files/BO4E.BO.Marktlokation.proto index 60840d57..ea979c3c 100644 --- a/protobuf-files/BO4E.BO.Marktlokation.proto +++ b/BO4E-dotnet/protobuf-files/BO4E.BO.Marktlokation.proto @@ -1,4 +1,4 @@ -syntax = "proto2"; +syntax = "proto3"; import "protobuf-net/bcl.proto"; // schema for protobuf-net's handling of core .NET types enum AbgabeArt { @@ -13,14 +13,14 @@ enum AbgabeArt { TSS = 8; } message Adresse { - optional string postleitzahl = 3; - optional string ort = 4; - optional string strasse = 5; - optional string hausnummer = 6; - optional string postfach = 7; - optional string adresszusatz = 8; - optional string coErgaenzung = 9; - optional Landescode landescode = 10; + string Postleitzahl = 3; + string Ort = 4; + string Strasse = 5; + string Hausnummer = 6; + string Postfach = 7; + string Adresszusatz = 8; + string CoErgaenzung = 9; + Landescode Landescode = 10; } enum Anrede { HERR = 0; @@ -45,8 +45,8 @@ enum Bilanzierungsmethode { IMS = 5; } message Dienstleistung { - optional Dienstleistungstyp dienstleistungstyp = 3 [default = DATENBEREITSTELLUNG_TAEGLICH]; - optional string bezeichnung = 4; + Dienstleistungstyp Dienstleistungstyp = 3; + string Bezeichnung = 4; } enum Dienstleistungstyp { DATENBEREITSTELLUNG_TAEGLICH = 0; @@ -99,9 +99,10 @@ enum Fernschaltung { } enum Gasqualitaet { option allow_alias = true; + ZERO = 0; // proto3 requires a zero value as the first item (it can be named anything) H_GAS = 1; - HGAS = 1; L_GAS = 2; + HGAS = 1; LGAS = 2; } enum Gebiettyp { @@ -116,13 +117,13 @@ enum Gebiettyp { VERSORGUNGSGEBIET = 8; } message Geokoordinaten { - optional .bcl.Decimal breitengrad = 3 [default = 0]; - optional .bcl.Decimal laengengrad = 4 [default = 0]; + .bcl.Decimal Breitengrad = 3; + .bcl.Decimal Laengengrad = 4; } message Geraeteeigenschaften { - optional Geraetetyp geraetetyp = 3 [default = WECHSELSTROMZAEHLER]; - optional Geraetemerkmal geraetemerkmal = 4; - map parameter = 1005; + Geraetetyp Geraetetyp = 3; + Geraetemerkmal Geraetemerkmal = 4; + map Parameter = 1005; } enum Geraetemerkmal { EINTARIF = 0; @@ -210,21 +211,21 @@ enum Geraetetyp { KOMBIMESSWANDLER = 42; } message Geschaeftspartner { - optional Anrede anrede = 4; - optional string name1 = 6; - optional string name2 = 7; - optional string name3 = 8; - optional bool gewerbekennzeichnung = 9 [default = false]; - optional string hrnummer = 10; - optional string amtsgericht = 11; - repeated Kontaktart kontaktweg = 12; - optional string umsatzsteuerId = 13; - optional string glaeubigerId = 14; - optional string eMailAdresse = 15; - optional string website = 16; - repeated Geschaeftspartnerrolle geschaeftspartnerrolle = 17; - optional Adresse partneradresse = 18; - optional string title = 1001; + Anrede Anrede = 4; + string Name1 = 6; + string Name2 = 7; + string Name3 = 8; + bool Gewerbekennzeichnung = 9; + string Hrnummer = 10; + string Amtsgericht = 11; + repeated Kontaktart Kontaktweg = 12 [packed = false]; + string UmsatzsteuerId = 13; + string GlaeubigerId = 14; + string EMailAdresse = 15; + string Website = 16; + repeated Geschaeftspartnerrolle Geschaeftspartnerrolle = 17 [packed = false]; + Adresse Partneradresse = 18; + string Title = 1001; } enum Geschaeftspartnerrolle { LIEFERANT = 0; @@ -234,15 +235,15 @@ enum Geschaeftspartnerrolle { MARKTPARTNER = 4; } message Hardware { - optional Geraetetyp geraetetyp = 3 [default = WECHSELSTROMZAEHLER]; - optional string bezeichnung = 4; - optional Geraeteeigenschaften geraeteeigenschaften = 1005; - optional string geraetenummer = 1006; - optional string geraetereferenz = 1007; + Geraetetyp Geraetetyp = 3; + string Bezeichnung = 4; + Geraeteeigenschaften Geraeteeigenschaften = 1005; + string Geraetenummer = 1006; + string Geraetereferenz = 1007; } message Katasteradresse { - optional string gemarkung_flur = 3; - optional string flurstueck = 4; + string Gemarkung_flur = 3; + string Flurstueck = 4; } enum Kontaktart { ANSCHREIBEN = 0; @@ -252,9 +253,9 @@ enum Kontaktart { SMS = 4; } message Konzessionsabgabe { - optional AbgabeArt satz = 3 [default = KAS]; - optional .bcl.Decimal kosten = 4 [default = 0]; - optional string kategorie = 5; + AbgabeArt Satz = 3; + .bcl.Decimal Kosten = 4; + string Kategorie = 5; } enum Landescode { AC = 0; @@ -526,31 +527,31 @@ enum Landescode { ZW = 266; } message Marktlokation { - optional string marktlokationsId = 4 [default = "|null|"]; - optional Sparte sparte = 5 [default = STROM]; - optional Energierichtung energierichtung = 6 [default = AUSSP]; - optional Bilanzierungsmethode bilanzierungsmethode = 7 [default = RLM]; - optional Verbrauchsart verbrauchsart = 8; - optional bool unterbrechbar = 9; - optional Netzebene netzebene = 10 [default = NSP]; - optional string netzbetreibercodenr = 11; - optional Gebiettyp gebiettyp = 12; - optional string netzgebietnr = 13; - optional string bilanzierungsgebiet = 14; - optional string grundversorgercodenr = 15; - optional Gasqualitaet gasqualitaet = 16; - optional Geschaeftspartner endkunde = 17; - optional Adresse lokationsadresse = 18; - optional Geokoordinaten geoadresse = 19; - optional Katasteradresse katasterinformation = 20; - repeated Messlokationszuordnung zugehoerigeMesslokationen = 28; - repeated Marktrolle marktrollen = 1021; - optional string regelzone = 1022; - optional string marktgebiet = 1023; - optional Zeitreihentyp zeitreihentyp = 1024; - repeated Zaehlwerk zaehlwerke = 1025; - repeated Verbrauch verbauchsmenge = 1026; - repeated Messlokation messlokationen = 1027; + string MarktlokationsId = 4; // default value could not be applied: |null| + Sparte Sparte = 5; + Energierichtung Energierichtung = 6; + Bilanzierungsmethode Bilanzierungsmethode = 7; + Verbrauchsart Verbrauchsart = 8; + bool Unterbrechbar = 9; + Netzebene Netzebene = 10; + string NetzbetreiberCodeNr = 11; + Gebiettyp GebietType = 12; + string NetzgebietNr = 13; + string Bilanzierungsgebiet = 14; + string GrundversorgerCodeNr = 15; + Gasqualitaet Gasqualitaet = 16; + Geschaeftspartner Endkunde = 17; + Adresse Lokationsadresse = 18; + Geokoordinaten Geoadresse = 19; + Katasteradresse Katasterinformation = 20; + repeated Messlokationszuordnung ZugehoerigeMesslokationen = 28; + repeated Marktrolle Marktrollen = 1021; + string Regelzone = 1022; + string Marktgebiet = 1023; + Zeitreihentyp Zeitreihentyp = 1024; + repeated Zaehlwerk Zaehlwerke = 1025; + repeated Verbrauch Verbrauchsmenge = 1026; + repeated Messlokation Messlokationen = 1027; } enum Marktrolle { NB = 0; @@ -569,52 +570,53 @@ enum Marktrolle { INTERESSENT = 13; } message Marktrolle { - optional string rollencodenummer = 3; - optional string code = 4; - optional Marktrolle marktrolle = 5 [default = NB]; + string Rollencodenummer = 3; + string Code = 4; + Marktrolle marktrolle = 5; } enum Mengeneinheit { + ZERO = 0; // proto3 requires a zero value as the first item (it can be named anything) WH = 2; KW = 3; + KWH = 2000; + MW = 3000; + MWH = 2000000; ANZAHL = 7; KUBIKMETER = 11; STUNDE = 13; TAG = 17; MONAT = 19; - VAR = 23; - VARH = 29; JAHR = 228; - KWH = 2000; - MW = 3000; + VAR = 23; KVAR = 23000; + VARH = 29; KVARH = 29000; - MWH = 2000000; } message Messlokation { - optional string messlokationsId = 4 [default = "|null|"]; - optional Sparte sparte = 5 [default = STROM]; - optional Netzebene netzebeneMessung = 6; - optional string messgebietNr = 7; - optional string grundzustaendigerMSBCodeNr = 8; - optional string grundzustaendigerMSBIMCodeNr = 9; - optional string grundzustaendigerMDLCodeNr = 10; - optional Adresse messadresse = 11; - optional Geokoordinaten geoadresse = 12; - optional Katasteradresse katasterinformation = 13; - repeated Hardware geraete = 14; - repeated Dienstleistung messdienstleistung = 15; - repeated Zaehler messlokationszaehler = 16; - optional Bilanzierungsmethode bilanzierungsmethode = 17; - optional bool abrechnungmessstellenbetriebnna = 1018; - repeated Marktrolle marktrollen = 1019; - optional Gasqualitaet gasqualitaet = 1020; - optional .bcl.Decimal verlustfaktor = 1021; + string MesslokationsId = 4; // default value could not be applied: |null| + Sparte Sparte = 5; + Netzebene NetzebeneMessung = 6; + string MessgebietNr = 7; + string GrundzustaendigerMSBCodeNr = 8; + string GrundzustaendigerMSBIMCodeNr = 9; + string GrundzustaendigerMDLCodeNr = 10; + Adresse Messadresse = 11; + Geokoordinaten Geoadresse = 12; + Katasteradresse Katasterinformation = 13; + repeated Hardware Geraete = 14; + repeated Dienstleistung Messdienstleistung = 15; + repeated Zaehler Messlokationszaehler = 16; + Bilanzierungsmethode Bilanzierungsmethode = 17; + bool Abrechnungmessstellenbetriebnna = 1018; + repeated Marktrolle Marktrollen = 1019; + Gasqualitaet Gasqualitaet = 1020; + .bcl.Decimal Verlustfaktor = 1021; } message Messlokationszuordnung { - optional string messlokationsId = 3; - optional ArithmetischeOperation arithmetik = 4; - optional .bcl.DateTime gueltigSeit = 5; - optional .bcl.DateTime gueltigBis = 6; + string MesslokationsId = 3; + ArithmetischeOperation Arithmetik = 4; + .bcl.DateTime GueltigSeit = 5; + .bcl.DateTime GueltigBis = 6; } enum Messwerterfassung { FERNAUSLESBAR = 0; @@ -656,13 +658,13 @@ enum Unterbrechbarkeit { NUV = 1; } message Verbrauch { - optional .bcl.DateTime startdatum = 3; - optional .bcl.DateTime enddatum = 4; - optional Wertermittlungsverfahren wertermittlungsverfahren = 5 [default = PROGNOSE]; - optional string obiskennzahl = 6; - optional .bcl.Decimal wert = 7 [default = 0]; - optional Mengeneinheit einheit = 8 [default = 0]; - optional Verbrauchsmengetyp type = 9; + .bcl.DateTime Startdatum = 3; + .bcl.DateTime Enddatum = 4; + Wertermittlungsverfahren Wertermittlungsverfahren = 5; + string Obiskennzahl = 6; + .bcl.Decimal Wert = 7; + Mengeneinheit Einheit = 8; + Verbrauchsmengetyp Type = 9; } enum Verbrauchsart { KL = 0; @@ -692,19 +694,19 @@ enum Wertermittlungsverfahren { MESSUNG = 1; } message Zaehler { - optional string zaehlernummer = 4; - optional Sparte sparte = 5 [default = STROM]; - optional Zaehlerauspraegung zaehlerauspraegung = 6 [default = EINRICHTUNGSZAEHLER]; - optional Zaehlertyp zaehlertyp = 7 [default = DREHSTROMZAEHLER]; - optional Tarifart tarifart = 8 [default = EINTARIF]; - optional .bcl.Decimal zaehlerkonstante = 9 [default = 0]; - optional .bcl.DateTime eichungBis = 10; - optional .bcl.DateTime letzteEichung = 11; - repeated Zaehlwerk zaehlwerke = 12; - optional Geschaeftspartner zaehlerhersteller = 13; - optional string gateway = 1014; - optional Fernschaltung fernschaltung = 1015; - optional Messwerterfassung messwerterfassung = 1016; + string Zaehlernummer = 4; + Sparte Sparte = 5; + Zaehlerauspraegung Zaehlerauspraegung = 6; + Zaehlertyp Zaehlertyp = 7; + Tarifart Tarifart = 8; + .bcl.Decimal zaehlerkonstante = 9; + .bcl.DateTime EichungBis = 10; + .bcl.DateTime LetzteEichung = 11; + repeated Zaehlwerk Zaehlwerke = 12; + Geschaeftspartner Zaehlerhersteller = 13; + string Gateway = 1014; + Fernschaltung Fernschaltung = 1015; + Messwerterfassung Messwerterfassung = 1016; } enum Zaehlerauspraegung { EINRICHTUNGSZAEHLER = 0; @@ -722,22 +724,22 @@ enum Zaehlertyp { WECHSELSTROMZAEHLER = 8; } message Zaehlwerk { - optional string zaehlwerkId = 3; - optional string bezeichnung = 4; - optional Energierichtung richtung = 5 [default = AUSSP]; - optional string obisKennzahl = 6; - optional .bcl.Decimal wandlerfaktor = 7 [default = 0]; - optional Mengeneinheit einheit = 8 [default = 0]; - optional string kennzahl = 1009; - optional Schwachlastfaehig schwachlastfaehig = 1010; - repeated Verwendungszweck verwendungszwecke = 1011; - optional Verbrauchsart verbrauchsart = 1012; - optional Unterbrechbarkeit unterbrechbarkeit = 1013; - optional Waermenutzung waermenutzung = 1014; - optional Konzessionsabgabe konzessionsabgabe = 1015; - optional bool steuerbefreit = 1016; - optional int32 vorkommastelle = 1017; - optional int32 nachkommastelle = 1018; + string ZaehlwerkId = 3; + string Bezeichnung = 4; + Energierichtung Richtung = 5; + string ObisKennzahl = 6; + .bcl.Decimal Wandlerfaktor = 7; + Mengeneinheit Einheit = 8; + string Kennzahl = 1009; + Schwachlastfaehig Schwachlastfaehig = 1010; + repeated Verwendungszweck Verwendungszwecke = 1011 [packed = false]; + Verbrauchsart Verbrauchsart = 1012; + Unterbrechbarkeit Unterbrechbarkeit = 1013; + Waermenutzung Waermenutzung = 1014; + Konzessionsabgabe Konzessionsabgabe = 1015; + bool Steuerbefreit = 1016; + int32 Vorkommastelle = 1017; + int32 Nachkommastelle = 1018; } enum Zeitreihentyp { EGS = 0; diff --git a/protobuf-files/BO4E.BO.Messlokation.proto b/BO4E-dotnet/protobuf-files/BO4E.BO.Messlokation.proto similarity index 70% rename from protobuf-files/BO4E.BO.Messlokation.proto rename to BO4E-dotnet/protobuf-files/BO4E.BO.Messlokation.proto index 4573711c..083c8ae2 100644 --- a/protobuf-files/BO4E.BO.Messlokation.proto +++ b/BO4E-dotnet/protobuf-files/BO4E.BO.Messlokation.proto @@ -1,4 +1,4 @@ -syntax = "proto2"; +syntax = "proto3"; import "protobuf-net/bcl.proto"; // schema for protobuf-net's handling of core .NET types enum AbgabeArt { @@ -13,14 +13,14 @@ enum AbgabeArt { TSS = 8; } message Adresse { - optional string postleitzahl = 3; - optional string ort = 4; - optional string strasse = 5; - optional string hausnummer = 6; - optional string postfach = 7; - optional string adresszusatz = 8; - optional string coErgaenzung = 9; - optional Landescode landescode = 10; + string Postleitzahl = 3; + string Ort = 4; + string Strasse = 5; + string Hausnummer = 6; + string Postfach = 7; + string Adresszusatz = 8; + string CoErgaenzung = 9; + Landescode Landescode = 10; } enum Anrede { HERR = 0; @@ -39,8 +39,8 @@ enum Bilanzierungsmethode { IMS = 5; } message Dienstleistung { - optional Dienstleistungstyp dienstleistungstyp = 3 [default = DATENBEREITSTELLUNG_TAEGLICH]; - optional string bezeichnung = 4; + Dienstleistungstyp Dienstleistungstyp = 3; + string Bezeichnung = 4; } enum Dienstleistungstyp { DATENBEREITSTELLUNG_TAEGLICH = 0; @@ -93,19 +93,20 @@ enum Fernschaltung { } enum Gasqualitaet { option allow_alias = true; + ZERO = 0; // proto3 requires a zero value as the first item (it can be named anything) H_GAS = 1; - HGAS = 1; L_GAS = 2; + HGAS = 1; LGAS = 2; } message Geokoordinaten { - optional .bcl.Decimal breitengrad = 3 [default = 0]; - optional .bcl.Decimal laengengrad = 4 [default = 0]; + .bcl.Decimal Breitengrad = 3; + .bcl.Decimal Laengengrad = 4; } message Geraeteeigenschaften { - optional Geraetetyp geraetetyp = 3 [default = WECHSELSTROMZAEHLER]; - optional Geraetemerkmal geraetemerkmal = 4; - map parameter = 1005; + Geraetetyp Geraetetyp = 3; + Geraetemerkmal Geraetemerkmal = 4; + map Parameter = 1005; } enum Geraetemerkmal { EINTARIF = 0; @@ -193,21 +194,21 @@ enum Geraetetyp { KOMBIMESSWANDLER = 42; } message Geschaeftspartner { - optional Anrede anrede = 4; - optional string name1 = 6; - optional string name2 = 7; - optional string name3 = 8; - optional bool gewerbekennzeichnung = 9 [default = false]; - optional string hrnummer = 10; - optional string amtsgericht = 11; - repeated Kontaktart kontaktweg = 12; - optional string umsatzsteuerId = 13; - optional string glaeubigerId = 14; - optional string eMailAdresse = 15; - optional string website = 16; - repeated Geschaeftspartnerrolle geschaeftspartnerrolle = 17; - optional Adresse partneradresse = 18; - optional string title = 1001; + Anrede Anrede = 4; + string Name1 = 6; + string Name2 = 7; + string Name3 = 8; + bool Gewerbekennzeichnung = 9; + string Hrnummer = 10; + string Amtsgericht = 11; + repeated Kontaktart Kontaktweg = 12 [packed = false]; + string UmsatzsteuerId = 13; + string GlaeubigerId = 14; + string EMailAdresse = 15; + string Website = 16; + repeated Geschaeftspartnerrolle Geschaeftspartnerrolle = 17 [packed = false]; + Adresse Partneradresse = 18; + string Title = 1001; } enum Geschaeftspartnerrolle { LIEFERANT = 0; @@ -217,15 +218,15 @@ enum Geschaeftspartnerrolle { MARKTPARTNER = 4; } message Hardware { - optional Geraetetyp geraetetyp = 3 [default = WECHSELSTROMZAEHLER]; - optional string bezeichnung = 4; - optional Geraeteeigenschaften geraeteeigenschaften = 1005; - optional string geraetenummer = 1006; - optional string geraetereferenz = 1007; + Geraetetyp Geraetetyp = 3; + string Bezeichnung = 4; + Geraeteeigenschaften Geraeteeigenschaften = 1005; + string Geraetenummer = 1006; + string Geraetereferenz = 1007; } message Katasteradresse { - optional string gemarkung_flur = 3; - optional string flurstueck = 4; + string Gemarkung_flur = 3; + string Flurstueck = 4; } enum Kontaktart { ANSCHREIBEN = 0; @@ -235,9 +236,9 @@ enum Kontaktart { SMS = 4; } message Konzessionsabgabe { - optional AbgabeArt satz = 3 [default = KAS]; - optional .bcl.Decimal kosten = 4 [default = 0]; - optional string kategorie = 5; + AbgabeArt Satz = 3; + .bcl.Decimal Kosten = 4; + string Kategorie = 5; } enum Landescode { AC = 0; @@ -509,9 +510,9 @@ enum Landescode { ZW = 266; } message Marktrolle { - optional string rollencodenummer = 3; - optional string code = 4; - optional Marktrolle marktrolle = 5 [default = NB]; + string Rollencodenummer = 3; + string Code = 4; + Marktrolle marktrolle = 5; } enum Marktrolle { NB = 0; @@ -530,41 +531,42 @@ enum Marktrolle { INTERESSENT = 13; } enum Mengeneinheit { + ZERO = 0; // proto3 requires a zero value as the first item (it can be named anything) WH = 2; KW = 3; + KWH = 2000; + MW = 3000; + MWH = 2000000; ANZAHL = 7; KUBIKMETER = 11; STUNDE = 13; TAG = 17; MONAT = 19; - VAR = 23; - VARH = 29; JAHR = 228; - KWH = 2000; - MW = 3000; + VAR = 23; KVAR = 23000; + VARH = 29; KVARH = 29000; - MWH = 2000000; } message Messlokation { - optional string messlokationsId = 4 [default = "|null|"]; - optional Sparte sparte = 5 [default = STROM]; - optional Netzebene netzebeneMessung = 6; - optional string messgebietNr = 7; - optional string grundzustaendigerMSBCodeNr = 8; - optional string grundzustaendigerMSBIMCodeNr = 9; - optional string grundzustaendigerMDLCodeNr = 10; - optional Adresse messadresse = 11; - optional Geokoordinaten geoadresse = 12; - optional Katasteradresse katasterinformation = 13; - repeated Hardware geraete = 14; - repeated Dienstleistung messdienstleistung = 15; - repeated Zaehler messlokationszaehler = 16; - optional Bilanzierungsmethode bilanzierungsmethode = 17; - optional bool abrechnungmessstellenbetriebnna = 1018; - repeated Marktrolle marktrollen = 1019; - optional Gasqualitaet gasqualitaet = 1020; - optional .bcl.Decimal verlustfaktor = 1021; + string MesslokationsId = 4; // default value could not be applied: |null| + Sparte Sparte = 5; + Netzebene NetzebeneMessung = 6; + string MessgebietNr = 7; + string GrundzustaendigerMSBCodeNr = 8; + string GrundzustaendigerMSBIMCodeNr = 9; + string GrundzustaendigerMDLCodeNr = 10; + Adresse Messadresse = 11; + Geokoordinaten Geoadresse = 12; + Katasteradresse Katasterinformation = 13; + repeated Hardware Geraete = 14; + repeated Dienstleistung Messdienstleistung = 15; + repeated Zaehler Messlokationszaehler = 16; + Bilanzierungsmethode Bilanzierungsmethode = 17; + bool Abrechnungmessstellenbetriebnna = 1018; + repeated Marktrolle Marktrollen = 1019; + Gasqualitaet Gasqualitaet = 1020; + .bcl.Decimal Verlustfaktor = 1021; } enum Messwerterfassung { FERNAUSLESBAR = 0; @@ -624,19 +626,19 @@ enum Waermenutzung { DIREKTHEIZUNG = 2; } message Zaehler { - optional string zaehlernummer = 4; - optional Sparte sparte = 5 [default = STROM]; - optional Zaehlerauspraegung zaehlerauspraegung = 6 [default = EINRICHTUNGSZAEHLER]; - optional Zaehlertyp zaehlertyp = 7 [default = DREHSTROMZAEHLER]; - optional Tarifart tarifart = 8 [default = EINTARIF]; - optional .bcl.Decimal zaehlerkonstante = 9 [default = 0]; - optional .bcl.DateTime eichungBis = 10; - optional .bcl.DateTime letzteEichung = 11; - repeated Zaehlwerk zaehlwerke = 12; - optional Geschaeftspartner zaehlerhersteller = 13; - optional string gateway = 1014; - optional Fernschaltung fernschaltung = 1015; - optional Messwerterfassung messwerterfassung = 1016; + string Zaehlernummer = 4; + Sparte Sparte = 5; + Zaehlerauspraegung Zaehlerauspraegung = 6; + Zaehlertyp Zaehlertyp = 7; + Tarifart Tarifart = 8; + .bcl.Decimal zaehlerkonstante = 9; + .bcl.DateTime EichungBis = 10; + .bcl.DateTime LetzteEichung = 11; + repeated Zaehlwerk Zaehlwerke = 12; + Geschaeftspartner Zaehlerhersteller = 13; + string Gateway = 1014; + Fernschaltung Fernschaltung = 1015; + Messwerterfassung Messwerterfassung = 1016; } enum Zaehlerauspraegung { EINRICHTUNGSZAEHLER = 0; @@ -654,20 +656,20 @@ enum Zaehlertyp { WECHSELSTROMZAEHLER = 8; } message Zaehlwerk { - optional string zaehlwerkId = 3; - optional string bezeichnung = 4; - optional Energierichtung richtung = 5 [default = AUSSP]; - optional string obisKennzahl = 6; - optional .bcl.Decimal wandlerfaktor = 7 [default = 0]; - optional Mengeneinheit einheit = 8 [default = 0]; - optional string kennzahl = 1009; - optional Schwachlastfaehig schwachlastfaehig = 1010; - repeated Verwendungszweck verwendungszwecke = 1011; - optional Verbrauchsart verbrauchsart = 1012; - optional Unterbrechbarkeit unterbrechbarkeit = 1013; - optional Waermenutzung waermenutzung = 1014; - optional Konzessionsabgabe konzessionsabgabe = 1015; - optional bool steuerbefreit = 1016; - optional int32 vorkommastelle = 1017; - optional int32 nachkommastelle = 1018; + string ZaehlwerkId = 3; + string Bezeichnung = 4; + Energierichtung Richtung = 5; + string ObisKennzahl = 6; + .bcl.Decimal Wandlerfaktor = 7; + Mengeneinheit Einheit = 8; + string Kennzahl = 1009; + Schwachlastfaehig Schwachlastfaehig = 1010; + repeated Verwendungszweck Verwendungszwecke = 1011 [packed = false]; + Verbrauchsart Verbrauchsart = 1012; + Unterbrechbarkeit Unterbrechbarkeit = 1013; + Waermenutzung Waermenutzung = 1014; + Konzessionsabgabe Konzessionsabgabe = 1015; + bool Steuerbefreit = 1016; + int32 Vorkommastelle = 1017; + int32 Nachkommastelle = 1018; } diff --git a/protobuf-files/BO4E.BO.Preisblatt.proto b/BO4E-dotnet/protobuf-files/BO4E.BO.Preisblatt.proto similarity index 69% rename from protobuf-files/BO4E.BO.Preisblatt.proto rename to BO4E-dotnet/protobuf-files/BO4E.BO.Preisblatt.proto index 8ed452e8..35ba3702 100644 --- a/protobuf-files/BO4E.BO.Preisblatt.proto +++ b/BO4E-dotnet/protobuf-files/BO4E.BO.Preisblatt.proto @@ -1,4 +1,4 @@ -syntax = "proto2"; +syntax = "proto3"; import "protobuf-net/bcl.proto"; // schema for protobuf-net's handling of core .NET types enum AufAbschlagstyp { @@ -110,58 +110,59 @@ enum Leistungstyp { INKASSOKOSTEN = 22; } enum Mengeneinheit { + ZERO = 0; // proto3 requires a zero value as the first item (it can be named anything) WH = 2; KW = 3; + KWH = 2000; + MW = 3000; + MWH = 2000000; ANZAHL = 7; KUBIKMETER = 11; STUNDE = 13; TAG = 17; MONAT = 19; - VAR = 23; - VARH = 29; JAHR = 228; - KWH = 2000; - MW = 3000; + VAR = 23; KVAR = 23000; + VARH = 29; KVARH = 29000; - MWH = 2000000; } message PositionsAufAbschlag { - optional string bezeichnung = 3; - optional string beschreibung = 4; - optional AufAbschlagstyp aufAbschlagstyp = 5 [default = RELATIV]; - optional .bcl.Decimal aufAbschlagswert = 6 [default = 0]; - optional Waehrungseinheit aufAbschlagswaehrung = 7 [default = EUR]; + string Bezeichnung = 3; + string Beschreibung = 4; + AufAbschlagstyp AufAbschlagstyp = 5; + .bcl.Decimal AufAbschlagswert = 6; + Waehrungseinheit AufAbschlagswaehrung = 7; } message Preisblatt { - optional string bezeichnung = 4; - optional Zeitraum gueltigkeit = 5; - repeated Preisposition preispositionen = 6; + string Bezeichnung = 4; + Zeitraum Gueltigkeit = 5; + repeated Preisposition Preispositionen = 6; } message Preisposition { - optional Kalkulationsmethode berechnungsmethode = 3 [default = KEINE]; - optional Leistungstyp leistungstyp = 4 [default = ARBEITSPREIS_WIRKARBEIT]; - optional string leistungsbezeichung = 5; - optional Waehrungseinheit preiseinheit = 6 [default = EUR]; - optional Mengeneinheit bezugsgroesse = 7 [default = 0]; - optional Zeiteinheit zeitbasis = 8; - optional Tarifzeit tarifzeit = 9; - optional BDEWArtikelnummer bdewArtikelnummer = 10; - optional Bemessungsgroesse zonungsgroesse = 11; - optional PositionsAufAbschlag zu_abschlaege = 12; - repeated Preisstaffel preisstaffeln = 13; + Kalkulationsmethode Berechnungsmethode = 3; + Leistungstyp Leistungstyp = 4; + string Leistungsbezeichung = 5; + Waehrungseinheit Preiseinheit = 6; + Mengeneinheit Bezugsgroesse = 7; + Zeiteinheit Zeitbasis = 8; + Tarifzeit Tarifzeit = 9; + BDEWArtikelnummer BdewArtikelnummer = 10; + Bemessungsgroesse Zonungsgroesse = 11; + PositionsAufAbschlag Zu_abschlaege = 12; + repeated Preisstaffel Preisstaffeln = 13; } message Preisstaffel { - optional .bcl.Decimal einheitspreis = 3 [default = 0]; - optional .bcl.Decimal staffelgrenzeVon = 4 [default = 0]; - optional .bcl.Decimal staffelgrenzeBis = 5 [default = 0]; - optional Sigmoidparameter sigmoidparameter = 6; + .bcl.Decimal Einheitspreis = 3; + .bcl.Decimal StaffelgrenzeVon = 4; + .bcl.Decimal StaffelgrenzeBis = 5; + Sigmoidparameter Sigmoidparameter = 6; } message Sigmoidparameter { - optional .bcl.Decimal A = 3 [default = 0]; - optional .bcl.Decimal B = 4 [default = 0]; - optional .bcl.Decimal C = 5 [default = 0]; - optional .bcl.Decimal D = 6 [default = 0]; + .bcl.Decimal A = 3; + .bcl.Decimal B = 4; + .bcl.Decimal C = 5; + .bcl.Decimal D = 6; } enum Tarifzeit { TZ_STANDARD = 0; @@ -185,8 +186,8 @@ enum Zeiteinheit { JAHR = 9; } message Zeitraum { - optional Zeiteinheit einheit = 3; - optional .bcl.Decimal dauer = 4; - optional .bcl.DateTime startdatum = 5; - optional .bcl.DateTime enddatum = 6; + Zeiteinheit Einheit = 3; + .bcl.Decimal Dauer = 4; + .bcl.DateTime Startdatum = 5; + .bcl.DateTime Enddatum = 6; } diff --git a/protobuf-files/BO4E.BO.Rechnung.proto b/BO4E-dotnet/protobuf-files/BO4E.BO.Rechnung.proto similarity index 73% rename from protobuf-files/BO4E.BO.Rechnung.proto rename to BO4E-dotnet/protobuf-files/BO4E.BO.Rechnung.proto index 4855c838..f5712423 100644 --- a/protobuf-files/BO4E.BO.Rechnung.proto +++ b/BO4E-dotnet/protobuf-files/BO4E.BO.Rechnung.proto @@ -1,15 +1,15 @@ -syntax = "proto2"; +syntax = "proto3"; import "protobuf-net/bcl.proto"; // schema for protobuf-net's handling of core .NET types message Adresse { - optional string postleitzahl = 3; - optional string ort = 4; - optional string strasse = 5; - optional string hausnummer = 6; - optional string postfach = 7; - optional string adresszusatz = 8; - optional string coErgaenzung = 9; - optional Landescode landescode = 10; + string Postleitzahl = 3; + string Ort = 4; + string Strasse = 5; + string Hausnummer = 6; + string Postfach = 7; + string Adresszusatz = 8; + string CoErgaenzung = 9; + Landescode Landescode = 10; } enum Anrede { HERR = 0; @@ -67,25 +67,25 @@ enum BDEWArtikelnummer { MSB_INKL_MESSUNG = 44; } message Betrag { - optional .bcl.Decimal wert = 3 [default = 0]; - optional Waehrungscode waehrung = 4 [default = AFN]; + .bcl.Decimal Wert = 3; + Waehrungscode Waehrung = 4; } message Geschaeftspartner { - optional Anrede anrede = 4; - optional string name1 = 6; - optional string name2 = 7; - optional string name3 = 8; - optional bool gewerbekennzeichnung = 9 [default = false]; - optional string hrnummer = 10; - optional string amtsgericht = 11; - repeated Kontaktart kontaktweg = 12; - optional string umsatzsteuerId = 13; - optional string glaeubigerId = 14; - optional string eMailAdresse = 15; - optional string website = 16; - repeated Geschaeftspartnerrolle geschaeftspartnerrolle = 17; - optional Adresse partneradresse = 18; - optional string title = 1001; + Anrede Anrede = 4; + string Name1 = 6; + string Name2 = 7; + string Name3 = 8; + bool Gewerbekennzeichnung = 9; + string Hrnummer = 10; + string Amtsgericht = 11; + repeated Kontaktart Kontaktweg = 12 [packed = false]; + string UmsatzsteuerId = 13; + string GlaeubigerId = 14; + string EMailAdresse = 15; + string Website = 16; + repeated Geschaeftspartnerrolle Geschaeftspartnerrolle = 17 [packed = false]; + Adresse Partneradresse = 18; + string Title = 1001; } enum Geschaeftspartnerrolle { LIEFERANT = 0; @@ -371,74 +371,75 @@ enum Landescode { ZW = 266; } message Menge { - optional .bcl.Decimal wert = 3 [default = 0]; - optional Mengeneinheit einheit = 4 [default = 0]; + .bcl.Decimal Wert = 3; + Mengeneinheit Einheit = 4; } enum Mengeneinheit { + ZERO = 0; // proto3 requires a zero value as the first item (it can be named anything) WH = 2; KW = 3; + KWH = 2000; + MW = 3000; + MWH = 2000000; ANZAHL = 7; KUBIKMETER = 11; STUNDE = 13; TAG = 17; MONAT = 19; - VAR = 23; - VARH = 29; JAHR = 228; - KWH = 2000; - MW = 3000; + VAR = 23; KVAR = 23000; + VARH = 29; KVARH = 29000; - MWH = 2000000; } message Preis { - optional .bcl.Decimal wert = 3 [default = 0]; - optional Waehrungseinheit einheit = 4 [default = EUR]; - optional Mengeneinheit bezugswert = 5 [default = 0]; - optional Preisstatus status = 6; + .bcl.Decimal Wert = 3; + Waehrungseinheit Einheit = 4; + Mengeneinheit Bezugswert = 5; + Preisstatus Status = 6; } enum Preisstatus { VORLAEUFIG = 0; ENDGUELTIG = 1; } message Rechnung { - optional string rechnungstitel = 4; - optional Rechnungsstatus rechnungsstatus = 5; - optional bool storno = 6 [default = false]; - optional string rechnungsnummer = 7; - optional .bcl.DateTime rechnungsdatum = 8; - optional .bcl.DateTime faelligkeitsdatum = 9; - optional Rechnungstyp rechnungsstyp = 10 [default = ABSCHLAGSRECHNUNG]; - optional string originalRechnungsnummer = 11; - optional Zeitraum rechnungsperiode = 12; - optional Geschaeftspartner rechnungsersteller = 13; - optional Geschaeftspartner rechnungsempfaenger = 14; - optional Betrag gesamtnetto = 15; - optional Betrag gesamtsteuer = 16; - optional Betrag gesamtbrutto = 17; - optional Betrag vorausgezahlt = 18; - optional Betrag rabattBrutto = 19; - optional Betrag zuzahlen = 20; - repeated Steuerbetrag steuerbetraege = 21; - repeated Rechnungsposition rechnungspositionen = 22; + string Rechnungstitel = 4; + Rechnungsstatus Rechnungsstatus = 5; + bool Storno = 6; + string Rechnungsnummer = 7; + .bcl.DateTime Rechnungsdatum = 8; + .bcl.DateTime Faelligkeitsdatum = 9; + Rechnungstyp Rechnungsstyp = 10; + string OriginalRechnungsnummer = 11; + Zeitraum Rechnungsperiode = 12; + Geschaeftspartner Rechnungsersteller = 13; + Geschaeftspartner Rechnungsempfaenger = 14; + Betrag Gesamtnetto = 15; + Betrag Gesamtsteuer = 16; + Betrag Gesamtbrutto = 17; + Betrag Vorausgezahlt = 18; + Betrag rabattBrutto = 19; + Betrag Zuzahlen = 20; + repeated Steuerbetrag Steuerbetraege = 21; + repeated Rechnungsposition Rechnungspositionen = 22; } message Rechnungsposition { - optional int32 positionsnummer = 3 [default = 0]; - optional .bcl.DateTime lieferungVon = 4; - optional .bcl.DateTime lieferungBis = 5; - optional string positionstext = 6; - optional Mengeneinheit zeiteinheit = 7; - optional BDEWArtikelnummer artikelnummer = 8; - optional string lokationsId = 9; - optional Menge positionsMenge = 10; - optional Menge zeitbezogeneMenge = 11; - optional Preis einzelpreis = 12; - optional Betrag teilsummeNetto = 13; - optional Betrag teilrabattNetto = 14; - optional Steuerbetrag teilsummeSteuer = 15; - optional string vertragskontoId = 16; - optional string vertragsId = 1017; - optional RechnungspositionsStatus status = 1018; + int32 Positionsnummer = 3; + .bcl.DateTime LieferungVon = 4; + .bcl.DateTime LieferungBis = 5; + string Positionstext = 6; + Mengeneinheit Zeiteinheit = 7; + BDEWArtikelnummer Artikelnummer = 8; + string LokationsId = 9; + Menge PositionsMenge = 10; + Menge ZeitbezogeneMenge = 11; + Preis Einzelpreis = 12; + Betrag TeilsummeNetto = 13; + Betrag TeilrabattNetto = 14; + Steuerbetrag TeilsummeSteuer = 15; + string VertragskontoId = 16; + string VertragsId = 1017; + RechnungspositionsStatus Status = 1018; } enum RechnungspositionsStatus { ROH = 0; @@ -464,10 +465,10 @@ enum Rechnungstyp { MEHRMINDERMENGENRECHNUNG = 7; } message Steuerbetrag { - optional Steuerkennzeichen steuerkennzeichen = 3 [default = UST_19]; - optional .bcl.Decimal basiswert = 4 [default = 0]; - optional .bcl.Decimal steuerwert = 5 [default = 0]; - optional Waehrungscode waehrung = 6 [default = AFN]; + Steuerkennzeichen Steuerkennzeichen = 3; + .bcl.Decimal Basiswert = 4; + .bcl.Decimal Steuerwert = 5; + Waehrungscode Waehrung = 6; } enum Steuerkennzeichen { UST_19 = 0; @@ -677,8 +678,8 @@ enum Zeiteinheit { JAHR = 9; } message Zeitraum { - optional Zeiteinheit einheit = 3; - optional .bcl.Decimal dauer = 4; - optional .bcl.DateTime startdatum = 5; - optional .bcl.DateTime enddatum = 6; + Zeiteinheit Einheit = 3; + .bcl.Decimal Dauer = 4; + .bcl.DateTime Startdatum = 5; + .bcl.DateTime Enddatum = 6; } diff --git a/protobuf-files/BO4E.BO.Region.proto b/BO4E-dotnet/protobuf-files/BO4E.BO.Region.proto similarity index 67% rename from protobuf-files/BO4E.BO.Region.proto rename to BO4E-dotnet/protobuf-files/BO4E.BO.Region.proto index a337c9e1..fbb78df2 100644 --- a/protobuf-files/BO4E.BO.Region.proto +++ b/BO4E-dotnet/protobuf-files/BO4E.BO.Region.proto @@ -1,4 +1,4 @@ -syntax = "proto2"; +syntax = "proto3"; enum Gueltigkeitstyp { NICHT_IN = 0; @@ -9,16 +9,16 @@ enum Mengenoperator { GLEICH = 2; } message Region { - optional string bezeichnung = 4; - repeated Regionskriterium positivListe = 5; - repeated Regionskriterium negativListe = 6; + string Bezeichnung = 4; + repeated Regionskriterium PositivListe = 5; + repeated Regionskriterium NegativListe = 6; } message Regionskriterium { - optional Gueltigkeitstyp gueltigkeitstyp = 3 [default = NICHT_IN]; - optional Sparte sparte = 4; - optional Mengenoperator mengenoperator = 5 [default = KLEINER_ALS]; - optional Regionskriteriumtyp regionskriteriumtyp = 6 [default = BUNDESLANDKENNZIFFER]; - optional string wert = 7; + Gueltigkeitstyp Gueltigkeitstyp = 3; + Sparte Sparte = 4; + Mengenoperator Mengenoperator = 5; + Regionskriteriumtyp Regionskriteriumtyp = 6; + string Wert = 7; } enum Regionskriteriumtyp { BUNDESLANDKENNZIFFER = 0; diff --git a/protobuf-files/BO4E.BO.Vertrag.proto b/BO4E-dotnet/protobuf-files/BO4E.BO.Vertrag.proto similarity index 61% rename from protobuf-files/BO4E.BO.Vertrag.proto rename to BO4E-dotnet/protobuf-files/BO4E.BO.Vertrag.proto index 9b3d7f82..0db22868 100644 --- a/protobuf-files/BO4E.BO.Vertrag.proto +++ b/BO4E-dotnet/protobuf-files/BO4E.BO.Vertrag.proto @@ -1,15 +1,15 @@ -syntax = "proto2"; +syntax = "proto3"; import "protobuf-net/bcl.proto"; // schema for protobuf-net's handling of core .NET types message Adresse { - optional string postleitzahl = 3; - optional string ort = 4; - optional string strasse = 5; - optional string hausnummer = 6; - optional string postfach = 7; - optional string adresszusatz = 8; - optional string coErgaenzung = 9; - optional Landescode landescode = 10; + string Postleitzahl = 3; + string Ort = 4; + string Strasse = 5; + string Hausnummer = 6; + string Postfach = 7; + string Adresszusatz = 8; + string CoErgaenzung = 9; + Landescode Landescode = 10; } enum Anrede { HERR = 0; @@ -20,21 +20,21 @@ enum Anrede { DR = 5; } message Geschaeftspartner { - optional Anrede anrede = 4; - optional string name1 = 6; - optional string name2 = 7; - optional string name3 = 8; - optional bool gewerbekennzeichnung = 9 [default = false]; - optional string hrnummer = 10; - optional string amtsgericht = 11; - repeated Kontaktart kontaktweg = 12; - optional string umsatzsteuerId = 13; - optional string glaeubigerId = 14; - optional string eMailAdresse = 15; - optional string website = 16; - repeated Geschaeftspartnerrolle geschaeftspartnerrolle = 17; - optional Adresse partneradresse = 18; - optional string title = 1001; + Anrede Anrede = 4; + string Name1 = 6; + string Name2 = 7; + string Name3 = 8; + bool Gewerbekennzeichnung = 9; + string Hrnummer = 10; + string Amtsgericht = 11; + repeated Kontaktart Kontaktweg = 12 [packed = false]; + string UmsatzsteuerId = 13; + string GlaeubigerId = 14; + string EMailAdresse = 15; + string Website = 16; + repeated Geschaeftspartnerrolle Geschaeftspartnerrolle = 17 [packed = false]; + Adresse Partneradresse = 18; + string Title = 1001; } enum Geschaeftspartnerrolle { LIEFERANT = 0; @@ -320,25 +320,26 @@ enum Landescode { ZW = 266; } message Menge { - optional .bcl.Decimal wert = 3 [default = 0]; - optional Mengeneinheit einheit = 4 [default = 0]; + .bcl.Decimal Wert = 3; + Mengeneinheit Einheit = 4; } enum Mengeneinheit { + ZERO = 0; // proto3 requires a zero value as the first item (it can be named anything) WH = 2; KW = 3; + KWH = 2000; + MW = 3000; + MWH = 2000000; ANZAHL = 7; KUBIKMETER = 11; STUNDE = 13; TAG = 17; MONAT = 19; - VAR = 23; - VARH = 29; JAHR = 228; - KWH = 2000; - MW = 3000; + VAR = 23; KVAR = 23000; + VARH = 29; KVARH = 29000; - MWH = 2000000; } enum NetznutzungsVertrag { KUNDEN_NB = 0; @@ -365,26 +366,26 @@ enum Sparte { ABWASSER = 5; } message Unterschrift { - optional string ort = 3; - optional .bcl.DateTime datum = 4; - optional string name = 5; + string Ort = 3; + .bcl.DateTime Datum = 4; + string Name = 5; } message Vertrag { - optional string vertragsnummer = 4; - optional string beschreibung = 5; - optional Vertragsart vertragsart = 6 [default = ENERGIELIEFERVERTRAG]; - optional Vertragstatus vertragstatus = 7 [default = IN_ARBEIT]; - optional Sparte sparte = 8 [default = STROM]; - optional .bcl.DateTime vertragsbeginn = 9; - optional .bcl.DateTime vertragsende = 10; - optional Geschaeftspartner vertragspartner1 = 11; - optional Geschaeftspartner vertragspartner2 = 12; - repeated Unterschrift unterzeichnervp1 = 13; - repeated Unterschrift unterzeichnervp2 = 14; - optional Vertragskonditionen vertragskonditionen = 15; - repeated Vertragsteil vertragsteile = 16; - optional .bcl.Decimal gemeinderabatt = 1017; - optional Geschaeftspartner korrespondenzpartner = 1018; + string Vertragsnummer = 4; + string Beschreibung = 5; + Vertragsart Vertragsart = 6; + Vertragstatus Vertragstatus = 7; + Sparte Sparte = 8; + .bcl.DateTime Vertragsbeginn = 9; + .bcl.DateTime Vertragsende = 10; + Geschaeftspartner Vertragspartner1 = 11; + Geschaeftspartner Vertragspartner2 = 12; + repeated Unterschrift Unterzeichnervp1 = 13; + repeated Unterschrift Unterzeichnervp2 = 14; + Vertragskonditionen Vertragskonditionen = 15; + repeated Vertragsteil Vertragsteile = 16; + .bcl.Decimal Gemeinderabatt = 1017; + Geschaeftspartner Korrespondenzpartner = 1018; } enum Vertragsart { ENERGIELIEFERVERTRAG = 0; @@ -394,22 +395,22 @@ enum Vertragsart { BUENDELVERTRAG = 4; } message Vertragskonditionen { - optional string beschreibung = 3; - optional int32 anzahlAbschlaege = 4; - optional Zeitraum vertragslaufzeit = 5; - optional Zeitraum kuendigungsfrist = 6; - optional Zeitraum vertragsverlaengerung = 7; - optional Zeitraum abschlagszyklus = 8; - optional .bcl.DateTime startAbrechnungsjahr = 1009; - optional Zeitraum geplanteTurnusablesung = 1010; - optional int32 turnusablesungIntervall = 1011; - optional Zeitraum netznutzungsabrechnung = 1012; - optional int32 netznutzungsabrechnungIntervall = 1013; - optional bool haushaltskunde = 1014; - optional NetznutzungsVertrag netznutzungsvertrag = 1015; - optional Netznutzungszahler netznutzungszahler = 1016; - optional Netznutzungsabrechnungsvariante netznutzungsabrechnungsvariante = 1017; - optional Netznutzungsabrechnungsgrundlage netznutzungsabrechnungsgrundlage = 1018; + string Beschreibung = 3; + int32 AnzahlAbschlaege = 4; + Zeitraum Vertragslaufzeit = 5; + Zeitraum Kuendigungsfrist = 6; + Zeitraum Vertragsverlaengerung = 7; + Zeitraum Abschlagszyklus = 8; + .bcl.DateTime StartAbrechnungsjahr = 1009; + Zeitraum GeplanteTurnusablesung = 1010; + int32 TurnusablesungIntervall = 1011; + Zeitraum Netznutzungsabrechnung = 1012; + int32 NetznutzungsabrechnungIntervall = 1013; + bool Haushaltskunde = 1014; + NetznutzungsVertrag Netznutzungsvertrag = 1015; + Netznutzungszahler Netznutzungszahler = 1016; + Netznutzungsabrechnungsvariante Netznutzungsabrechnungsvariante = 1017; + Netznutzungsabrechnungsgrundlage Netznutzungsabrechnungsgrundlage = 1018; } enum Vertragstatus { IN_ARBEIT = 0; @@ -423,15 +424,15 @@ enum Vertragstatus { BEENDET = 8; } message Vertragsteil { - optional .bcl.DateTime vertragsteilbeginn = 3; - optional .bcl.DateTime vertragsteilende = 4; - optional string lokation = 5; - optional Menge vertraglichFixierteMenge = 6; - optional Menge minimaleAbnahmemenge = 7; - optional Menge maximaleAbnahmemenge = 8; - optional Menge jahresverbrauchsprognose = 1009; - optional Menge kundenwert = 1010; - optional string verbrauchsaufteilung = 1011; + .bcl.DateTime Vertragsteilbeginn = 3; + .bcl.DateTime Vertragsteilende = 4; + string Lokation = 5; + Menge VertraglichFixierteMenge = 6; + Menge MinimaleAbnahmemenge = 7; + Menge MaximaleAbnahmemenge = 8; + Menge Jahresverbrauchsprognose = 1009; + Menge Kundenwert = 1010; + string Verbrauchsaufteilung = 1011; } enum Zeiteinheit { SEKUNDE = 0; @@ -446,8 +447,8 @@ enum Zeiteinheit { JAHR = 9; } message Zeitraum { - optional Zeiteinheit einheit = 3; - optional .bcl.Decimal dauer = 4; - optional .bcl.DateTime startdatum = 5; - optional .bcl.DateTime enddatum = 6; + Zeiteinheit Einheit = 3; + .bcl.Decimal Dauer = 4; + .bcl.DateTime Startdatum = 5; + .bcl.DateTime Enddatum = 6; } diff --git a/protobuf-files/BO4E.BO.Zaehler.proto b/BO4E-dotnet/protobuf-files/BO4E.BO.Zaehler.proto similarity index 69% rename from protobuf-files/BO4E.BO.Zaehler.proto rename to BO4E-dotnet/protobuf-files/BO4E.BO.Zaehler.proto index ceafdc1d..e7186e23 100644 --- a/protobuf-files/BO4E.BO.Zaehler.proto +++ b/BO4E-dotnet/protobuf-files/BO4E.BO.Zaehler.proto @@ -1,4 +1,4 @@ -syntax = "proto2"; +syntax = "proto3"; import "protobuf-net/bcl.proto"; // schema for protobuf-net's handling of core .NET types enum AbgabeArt { @@ -13,14 +13,14 @@ enum AbgabeArt { TSS = 8; } message Adresse { - optional string postleitzahl = 3; - optional string ort = 4; - optional string strasse = 5; - optional string hausnummer = 6; - optional string postfach = 7; - optional string adresszusatz = 8; - optional string coErgaenzung = 9; - optional Landescode landescode = 10; + string Postleitzahl = 3; + string Ort = 4; + string Strasse = 5; + string Hausnummer = 6; + string Postfach = 7; + string Adresszusatz = 8; + string CoErgaenzung = 9; + Landescode Landescode = 10; } enum Anrede { HERR = 0; @@ -39,21 +39,21 @@ enum Fernschaltung { NICHT_VORHANDEN = 1; } message Geschaeftspartner { - optional Anrede anrede = 4; - optional string name1 = 6; - optional string name2 = 7; - optional string name3 = 8; - optional bool gewerbekennzeichnung = 9 [default = false]; - optional string hrnummer = 10; - optional string amtsgericht = 11; - repeated Kontaktart kontaktweg = 12; - optional string umsatzsteuerId = 13; - optional string glaeubigerId = 14; - optional string eMailAdresse = 15; - optional string website = 16; - repeated Geschaeftspartnerrolle geschaeftspartnerrolle = 17; - optional Adresse partneradresse = 18; - optional string title = 1001; + Anrede Anrede = 4; + string Name1 = 6; + string Name2 = 7; + string Name3 = 8; + bool Gewerbekennzeichnung = 9; + string Hrnummer = 10; + string Amtsgericht = 11; + repeated Kontaktart Kontaktweg = 12 [packed = false]; + string UmsatzsteuerId = 13; + string GlaeubigerId = 14; + string EMailAdresse = 15; + string Website = 16; + repeated Geschaeftspartnerrolle Geschaeftspartnerrolle = 17 [packed = false]; + Adresse Partneradresse = 18; + string Title = 1001; } enum Geschaeftspartnerrolle { LIEFERANT = 0; @@ -70,9 +70,9 @@ enum Kontaktart { SMS = 4; } message Konzessionsabgabe { - optional AbgabeArt satz = 3 [default = KAS]; - optional .bcl.Decimal kosten = 4 [default = 0]; - optional string kategorie = 5; + AbgabeArt Satz = 3; + .bcl.Decimal Kosten = 4; + string Kategorie = 5; } enum Landescode { AC = 0; @@ -344,21 +344,22 @@ enum Landescode { ZW = 266; } enum Mengeneinheit { + ZERO = 0; // proto3 requires a zero value as the first item (it can be named anything) WH = 2; KW = 3; + KWH = 2000; + MW = 3000; + MWH = 2000000; ANZAHL = 7; KUBIKMETER = 11; STUNDE = 13; TAG = 17; MONAT = 19; - VAR = 23; - VARH = 29; JAHR = 228; - KWH = 2000; - MW = 3000; + VAR = 23; KVAR = 23000; + VARH = 29; KVARH = 29000; - MWH = 2000000; } enum Messwerterfassung { FERNAUSLESBAR = 0; @@ -406,19 +407,19 @@ enum Waermenutzung { DIREKTHEIZUNG = 2; } message Zaehler { - optional string zaehlernummer = 4; - optional Sparte sparte = 5 [default = STROM]; - optional Zaehlerauspraegung zaehlerauspraegung = 6 [default = EINRICHTUNGSZAEHLER]; - optional Zaehlertyp zaehlertyp = 7 [default = DREHSTROMZAEHLER]; - optional Tarifart tarifart = 8 [default = EINTARIF]; - optional .bcl.Decimal zaehlerkonstante = 9 [default = 0]; - optional .bcl.DateTime eichungBis = 10; - optional .bcl.DateTime letzteEichung = 11; - repeated Zaehlwerk zaehlwerke = 12; - optional Geschaeftspartner zaehlerhersteller = 13; - optional string gateway = 1014; - optional Fernschaltung fernschaltung = 1015; - optional Messwerterfassung messwerterfassung = 1016; + string Zaehlernummer = 4; + Sparte Sparte = 5; + Zaehlerauspraegung Zaehlerauspraegung = 6; + Zaehlertyp Zaehlertyp = 7; + Tarifart Tarifart = 8; + .bcl.Decimal zaehlerkonstante = 9; + .bcl.DateTime EichungBis = 10; + .bcl.DateTime LetzteEichung = 11; + repeated Zaehlwerk Zaehlwerke = 12; + Geschaeftspartner Zaehlerhersteller = 13; + string Gateway = 1014; + Fernschaltung Fernschaltung = 1015; + Messwerterfassung Messwerterfassung = 1016; } enum Zaehlerauspraegung { EINRICHTUNGSZAEHLER = 0; @@ -436,20 +437,20 @@ enum Zaehlertyp { WECHSELSTROMZAEHLER = 8; } message Zaehlwerk { - optional string zaehlwerkId = 3; - optional string bezeichnung = 4; - optional Energierichtung richtung = 5 [default = AUSSP]; - optional string obisKennzahl = 6; - optional .bcl.Decimal wandlerfaktor = 7 [default = 0]; - optional Mengeneinheit einheit = 8 [default = 0]; - optional string kennzahl = 1009; - optional Schwachlastfaehig schwachlastfaehig = 1010; - repeated Verwendungszweck verwendungszwecke = 1011; - optional Verbrauchsart verbrauchsart = 1012; - optional Unterbrechbarkeit unterbrechbarkeit = 1013; - optional Waermenutzung waermenutzung = 1014; - optional Konzessionsabgabe konzessionsabgabe = 1015; - optional bool steuerbefreit = 1016; - optional int32 vorkommastelle = 1017; - optional int32 nachkommastelle = 1018; + string ZaehlwerkId = 3; + string Bezeichnung = 4; + Energierichtung Richtung = 5; + string ObisKennzahl = 6; + .bcl.Decimal Wandlerfaktor = 7; + Mengeneinheit Einheit = 8; + string Kennzahl = 1009; + Schwachlastfaehig Schwachlastfaehig = 1010; + repeated Verwendungszweck Verwendungszwecke = 1011 [packed = false]; + Verbrauchsart Verbrauchsart = 1012; + Unterbrechbarkeit Unterbrechbarkeit = 1013; + Waermenutzung Waermenutzung = 1014; + Konzessionsabgabe Konzessionsabgabe = 1015; + bool Steuerbefreit = 1016; + int32 Vorkommastelle = 1017; + int32 Nachkommastelle = 1018; } diff --git a/protobuf-files/README.md b/BO4E-dotnet/protobuf-files/README.md similarity index 100% rename from protobuf-files/README.md rename to BO4E-dotnet/protobuf-files/README.md diff --git a/BO4ETestProject/BoEdiMapper/messlokation.json b/BO4ETestProject/BoEdiMapper/messlokation.json index 808045c4..343680d1 100644 --- a/BO4ETestProject/BoEdiMapper/messlokation.json +++ b/BO4ETestProject/BoEdiMapper/messlokation.json @@ -2,7 +2,7 @@ "expectedResult": { "versionStruktur": 1, "boTyp": "MESSLOKATION", - "messLokationsId": "DE1234567889", + "messlokationsId": "DE1234567889", "sparte": "STROM", "netzebeneMessung": "E06", "messgebietNr": null, @@ -19,7 +19,7 @@ "input": { "versionStruktur": 1, "boTyp": "MESSLOKATION", - "messLokationsId": "DE1234567889", + "messlokationsId": "DE1234567889", "sparte": "STROM", "netzebeneMessung": "NSP", "messgebietNr": null, diff --git a/BO4ETestProject/BoMapperTests/Vertrag_lenient_String.json b/BO4ETestProject/BoMapperTests/Vertrag_lenient_String.json new file mode 100644 index 00000000..7e213b0e --- /dev/null +++ b/BO4ETestProject/BoMapperTests/Vertrag_lenient_String.json @@ -0,0 +1,139 @@ +{ + "objectName": "Vertrag", + "lenientStringToInt": true, + "input": { + "versionStruktur": 1, + "boTyp": "VERTRAG", + "vertragsnummer": "cb32fb41-8bb1-436a-9465-76447b478480", + "beschreibung": "Grund- oder Ersatzversorgung", + "vertragsart": 0, + "vertragstatus": 3, + "sparte": 1, + "vertragsbeginn": "2020-02-18T00:00:00", + "vertragsende": "0001-01-01T00:00:00", + "vertragspartner1": { + "versionStruktur": 1, + "anrede": null, + "boTyp": "MARKTTEILNEHMER", + "title": null, + "name1": "Enercity Gas", + "name2": null, + "name3": null, + "gewerbekennzeichnung": true, + "hrnummer": null, + "amtsgericht": null, + "kontaktweg": null, + "umsatzsteuerId": null, + "glaeubigerId": null, + "eMailAdresse": null, + "website": null, + "geschaeftspartnerrolle": null, + "partneradresse": null, + "marktrolle": 0, + "rollencodenummer": "9800019400006", + "rollencodetyp": 1, + "makoadresse": "", + "ansprechpartner": null + }, + "vertragspartner2": { + "versionStruktur": 1, + "anrede": null, + "boTyp": "GESCHAEFTSPARTNER", + "title": null, + "name1": "enercityAG", + "name2": null, + "name3": "Ersatzversorgung", + "gewerbekennzeichnung": true, + "hrnummer": null, + "amtsgericht": "", + "kontaktweg": null, + "umsatzsteuerId": null, + "glaeubigerId": null, + "eMailAdresse": null, + "website": null, + "geschaeftspartnerrolle": null, + "partneradresse": { + "postleitzahl": "30167", + "ort": "Hannover", + "strasse": "Ihmeplatz", + "hausnummer": "2", + "postfach": null, + "adresszusatz": null, + "coErgaenzung": null, + "landescode": 61 + } + }, + "unterzeichnervp1": null, + "unterzeichnervp2": null, + "vertragskonditionen": { + "beschreibung": null, + "anzahlAbschlaege": "Item12", + "vertragslaufzeit": { + "einheit": 0, + "dauer": -63717580800.0, + "startdatum": "2020-02-18T00:00:00", + "enddatum": "0001-01-01T00:00:00" + }, + "kuendigungsfrist": null, + "vertragsverlaengerung": null, + "abschlagszyklus": null, + "startAbrechnungsjahr": "0001-01-01T00:00:00", + "geplanteTurnusablesung": null, + "turnusablesungIntervall": 1, + "netznutzungsabrechnung": { + "einheit": 4, + "dauer": 27.0, + "startdatum": "2020-10-01T00:00:00", + "enddatum": "2020-10-28T00:00:00" + }, + "netznutzungsabrechnungIntervall": 12, + "haushaltskunde": null, + "netznutzungsvertrag": 1, + "netznutzungszahler": 1, + "netznutzungsabrechnungsvariante": 0, + "netznutzungsabrechnungsgrundlage": 0 + }, + "vertragsteile": [ + { + "vertragsteilbeginn": "2020-04-01T00:00:00", + "vertragsteilende": "0001-01-01T00:00:00", + "lokation": "NCLB400117640000", + "vertraglichFixierteMenge": null, + "minimaleAbnahmemenge": null, + "maximaleAbnahmemenge": null, + "jahresverbrauchsprognose": null, + "kundenwert": null, + "verbrauchsaufteilung": null + } + ], + "gemeinderabatt": 0.0, + "korrespondenzpartner": { + "versionStruktur": 1, + "anrede": null, + "boTyp": "GESCHAEFTSPARTNER", + "title": null, + "name1": "enercityAG", + "name2": null, + "name3": "Ersatzversorgung", + "gewerbekennzeichnung": true, + "hrnummer": null, + "amtsgericht": "", + "kontaktweg": null, + "umsatzsteuerId": null, + "glaeubigerId": null, + "eMailAdresse": null, + "website": null, + "geschaeftspartnerrolle": null, + "partneradresse": { + "postleitzahl": "30167", + "ort": "Hannover", + "strasse": "Ihmeplatz", + "hausnummer": "2", + "postfach": null, + "adresszusatz": null, + "coErgaenzung": null, + "landescode": 61 + } + } + } +} diff --git a/BO4ETestProject/BoMapperTests/messlokation_hf_sap.json b/BO4ETestProject/BoMapperTests/messlokation_hf_sap.json index 51b163ac..2f014eda 100644 --- a/BO4ETestProject/BoMapperTests/messlokation_hf_sap.json +++ b/BO4ETestProject/BoMapperTests/messlokation_hf_sap.json @@ -3,7 +3,7 @@ "input": { "versionStruktur": 1, "boTyp": "MESSLOKATION", - "messLokationsId": "DE0000000000000000000000010000397", + "messlokationsId": "DE0000000000000000000000010000397", "sparte": "STROM", "netzebeneMessung": "MSP", "messgebietNr": null, diff --git a/BO4ETestProject/BoMapperTests/messlokation_userProps.json b/BO4ETestProject/BoMapperTests/messlokation_userProps.json index 60f40ecc..882a38f2 100644 --- a/BO4ETestProject/BoMapperTests/messlokation_userProps.json +++ b/BO4ETestProject/BoMapperTests/messlokation_userProps.json @@ -4,7 +4,7 @@ "input": { "versionStruktur": 1, "boTyp": "MESSLOKATION", - "messLokationsId": "DE0000000000000000000000010000397", + "messlokationsId": "DE0000000000000000000000010000397", "sparte": "STROM", "netzebeneMessung": "MSP", "messgebietNr": null, diff --git a/BO4ETestProject/BoMapperTests/rechnung.json b/BO4ETestProject/BoMapperTests/rechnung.json index b350386a..52f033f7 100644 --- a/BO4ETestProject/BoMapperTests/rechnung.json +++ b/BO4ETestProject/BoMapperTests/rechnung.json @@ -8,7 +8,7 @@ "rechnungsnummer": "003000000007", "rechnungsdatum": "2019-08-27T22:00:00Z", "faelligkeitsdatum": "2019-08-27T22:00:00Z", - "rechnungsstyp": "ABSCHLAGSRECHNUNG", + "rechnungstyp": "ABSCHLAGSRECHNUNG", "rechnungsperiode": { "startdatum": "2019-01-10T23:00:00Z", "enddatum": "2019-12-24T23:00:00Z" diff --git a/BO4ETestProject/TestBO4E-dotnet.csproj b/BO4ETestProject/TestBO4E-dotnet.csproj index f0168679..14a316d8 100644 --- a/BO4ETestProject/TestBO4E-dotnet.csproj +++ b/BO4ETestProject/TestBO4E-dotnet.csproj @@ -13,6 +13,10 @@ + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + @@ -54,6 +58,9 @@ Always + + Always + Always @@ -87,9 +94,6 @@ Always - - Always - Always @@ -102,6 +106,9 @@ Always + + Always + diff --git a/BO4ETestProject/TestBOCOMDesign.cs b/BO4ETestProject/TestBOCOMDesign.cs index 151272a1..6d66725a 100644 --- a/BO4ETestProject/TestBOCOMDesign.cs +++ b/BO4ETestProject/TestBOCOMDesign.cs @@ -2,11 +2,13 @@ using System.Collections.Generic; using System.Linq; using System.Reflection; -using BO4E; + using BO4E.BO; using BO4E.COM; using BO4E.meta; + using Microsoft.VisualStudio.TestTools.UnitTesting; + using Newtonsoft.Json; namespace TestBO4E @@ -15,13 +17,13 @@ namespace TestBO4E public class TestBOCOMDesign { [TestMethod] - public void TestNoPropertiesBo() + public void TestNoBOFields() { - foreach (var type in typeof(BusinessObject).Assembly.GetTypes().Where(t => t.BaseType == typeof(BusinessObject))) + foreach (var type in typeof(BusinessObject).Assembly.GetTypes().Where(t => typeof(BusinessObject).IsAssignableFrom(t))) { - var properties = type.GetProperties(); + var fields = type.GetFields(BindingFlags.Public); // properties are not allowed in BusinessObjects because a lot of features rely on fields! - Assert.AreEqual(0, properties.Count(), $"Type {type} must not contain properties but has: {String.Join(", ", properties.ToList())}"); + Assert.AreEqual(0, fields.Count(), $"Type {type} must not contain fields but has: {string.Join(", ", fields.ToList())}"); } } @@ -35,13 +37,13 @@ public void TestBoAllPublic() } [TestMethod] - public void TestNoPropertiesCOM() + public void TestNoCOMFields() { - foreach (var type in typeof(BO4E.COM.COM).Assembly.GetTypes().Where(t => t.BaseType == typeof(BO4E.COM.COM))) + foreach (var type in typeof(BO4E.COM.COM).Assembly.GetTypes().Where(t => typeof(COM).IsAssignableFrom(t))) { - var properties = type.GetProperties(); + var fields = type.GetFields(); // properties are not allowed in COM Objects because a lot of features rely on fields! - Assert.AreEqual(0, properties.Count(), $"Type {type} must not contain properties but has: {String.Join(", ", properties.ToList())}"); + Assert.AreEqual(0, fields.Count(), $"Type {type} must not contain fields but has: {string.Join(", ", fields.ToList())}"); } } @@ -91,8 +93,11 @@ public void TestBoKeys() { foreach (var type in typeof(BusinessObject).Assembly.GetTypes().Where(t => t.BaseType == typeof(BusinessObject) && !t.IsAbstract && !NO_KEYS_WHITELIST.Contains(t))) { - var keyFields = BoMapper.GetAnnotatedFields(type, typeof(BoKey)); - Assert.IsTrue(keyFields.Count() > 0, $"Type {type} is derived from {nameof(BusinessObject)} but has no [{nameof(BoKey)}] attribute."); + var keyProps = type.GetProperties() + .Where(p => p.GetCustomAttributes(typeof(BoKey), false).Length > 0) + .OrderBy(ap => ap.GetCustomAttribute()?.Order) + .ToArray(); + Assert.IsTrue(keyProps.Count() > 0, $"Type {type} is derived from {nameof(BusinessObject)} but has no [{nameof(BoKey)}] attribute."); } } @@ -104,21 +109,21 @@ public void NullableDefaultEnums() { foreach (var boType in typeof(BusinessObject).Assembly.GetTypes().Where(t => (t.BaseType == typeof(BusinessObject) || t.BaseType == typeof(COM)) && !t.IsAbstract)) { - foreach (var obligDefaultField in boType.GetFields(BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.Instance) + foreach (var obligDefaultField in boType.GetProperties(BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.Instance) .Where(field => field.GetCustomAttributes(typeof(JsonPropertyAttribute), true) .Cast() .Any(jpa => jpa.Required == Required.Default))) { - if (Nullable.GetUnderlyingType(obligDefaultField.FieldType) != null || obligDefaultField.FieldType==typeof(string)) + if (Nullable.GetUnderlyingType(obligDefaultField.PropertyType) != null || obligDefaultField.PropertyType == typeof(string)) { // it is already nullable. continue; } - if (!obligDefaultField.FieldType.IsPrimitive && !obligDefaultField.FieldType.IsEnum) + if (!obligDefaultField.PropertyType.IsPrimitive && !obligDefaultField.PropertyType.IsEnum) { continue; } - Assert.IsTrue(false, $"The type {obligDefaultField.FieldType} of {boType.FullName}.{obligDefaultField.Name} is not nullable but not marked as obligatory."); + Assert.IsTrue(false, $"The type {obligDefaultField.PropertyType} of {boType.FullName}.{obligDefaultField.Name} is not nullable but not marked as obligatory."); // this is a problem because e.g. for integers you can't distinguish between no value (null) or initial value (0). Same is true for Enum values } } diff --git a/BO4ETestProject/TestBOCOMGuids.cs b/BO4ETestProject/TestBOCOMGuids.cs index 56606514..6d17e5c1 100644 --- a/BO4ETestProject/TestBOCOMGuids.cs +++ b/BO4ETestProject/TestBOCOMGuids.cs @@ -15,9 +15,9 @@ public void TestBOGuids() { Energiemenge em = new Energiemenge() { - lokationsId = "DE123456", - lokationstyp = BO4E.ENUM.Lokationstyp.MaLo, - energieverbrauch = new List(), + LokationsId = "DE123456", + LokationsTyp = BO4E.ENUM.Lokationstyp.MaLo, + Energieverbrauch = new List(), guid = Guid.NewGuid().ToString() }; diff --git a/BO4ETestProject/TestBo4eUri.cs b/BO4ETestProject/TestBo4eUri.cs index 5d1af1c9..3bc4327d 100644 --- a/BO4ETestProject/TestBo4eUri.cs +++ b/BO4ETestProject/TestBo4eUri.cs @@ -2,10 +2,14 @@ using System.Collections.Generic; using System.IO; using System.Linq; + using BO4E.BO; using BO4E.meta; + using JsonDiffPatchDotNet; + using Microsoft.VisualStudio.TestTools.UnitTesting; + using Newtonsoft.Json; using Newtonsoft.Json.Linq; @@ -113,7 +117,7 @@ public void TestBoNamesAndTypes() private static readonly Dictionary> boKeyNamesResults = new Dictionary>() { {typeof(Marktlokation), new List{"marktlokationsId"}}, - {typeof(Messlokation), new List{"messLokationsId"} } //<-- should be the json property name if annotated + {typeof(Messlokation), new List{"messlokationsId"} } //<-- should be the json property name if annotated }; [TestMethod] @@ -123,7 +127,7 @@ public void TestBoKeyNames() { List expectedList = boKeyNamesResults[boType]; List actualList = BusinessObject.GetBoKeyNames(boType); - Assert.IsTrue(expectedList.SequenceEqual(actualList), $"{boType.ToString()}: expected: [{String.Join(",", expectedList)}] actual: [{String.Join(",", actualList)}] "); + Assert.IsTrue(expectedList.SequenceEqual(actualList), $"{boType.ToString()}: expected: [{string.Join(",", expectedList)}] actual: [{string.Join(",", actualList)}] "); } } @@ -154,8 +158,8 @@ public void TestUPInclusion() { string emString = @"{'versionStruktur':1,'boTyp':'ENERGIEMENGE','lokationsId':'DE0000000000000000000000010000400','lokationstyp':'MeLo','zw':'000000000030000301','anlagennummer':'4000000199','messlokationsId':'DE0000000000000000000000010000400','marktlokationsId':''}"; Energiemenge em = JsonConvert.DeserializeObject(emString); - Assert.IsNotNull(em.userProperties); - Assert.IsTrue(em.userProperties.Keys.Count > 0); + Assert.IsNotNull(em.UserProperties); + Assert.IsTrue(em.UserProperties.Keys.Count > 0); Bo4eUri uri = em.GetURI(true); Assert.IsTrue(uri.ToString().Contains("messlokationsId=")); Assert.IsTrue(uri.ToString().Contains("anlagennummer=4000000199")); diff --git a/BO4ETestProject/TestBoExpansion.cs b/BO4ETestProject/TestBoExpansion.cs index f743b9c9..40b707b6 100644 --- a/BO4ETestProject/TestBoExpansion.cs +++ b/BO4ETestProject/TestBoExpansion.cs @@ -11,7 +11,7 @@ public class TestBoExpansion [TestMethod] public void TestBoExpansionMaLo() { - HashSet result = new HashSet(BusinessObject.GetExpandableFieldNames(typeof(Marktlokation)).Keys); + HashSet result = new HashSet(BusinessObject.GetExpandablePropertyNames(typeof(Marktlokation)).Keys); Assert.IsTrue(result.Contains("zugehoerigeMesslokationen")); HashSet result2 = new HashSet(BusinessObject.GetExpandableFieldNames("Marktlokation").Keys); @@ -22,7 +22,7 @@ public void TestBoExpansionMaLo() [TestMethod] public void TestBoExpansionMeLo() { - HashSet result = new HashSet(BusinessObject.GetExpandableFieldNames(typeof(Messlokation)).Keys); + HashSet result = new HashSet(BusinessObject.GetExpandablePropertyNames(typeof(Messlokation)).Keys); Assert.IsTrue(result.Contains("messadresse")); Assert.IsTrue(result.Contains("messlokationszaehler")); Assert.IsTrue(result.Contains("messlokationszaehler.zaehlwerke")); @@ -31,7 +31,7 @@ public void TestBoExpansionMeLo() [TestMethod] public void TestTypesEnergiemenge() { - Dictionary result = BusinessObject.GetExpandableFieldNames(typeof(Energiemenge)); + Dictionary result = BusinessObject.GetExpandablePropertyNames(typeof(Energiemenge)); Assert.IsTrue(result.ContainsKey("energieverbrauch")); Type verbrauchsType = result["energieverbrauch"]; Assert.IsTrue(verbrauchsType.IsGenericType); diff --git a/BO4ETestProject/TestBoMapper.cs b/BO4ETestProject/TestBoMapper.cs index 61675cb9..fd043181 100644 --- a/BO4ETestProject/TestBoMapper.cs +++ b/BO4ETestProject/TestBoMapper.cs @@ -1,319 +1,327 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Reflection; -using BO4E; -using BO4E.BO; -using BO4E.COM; -//using BO4E.Extensions; -using Microsoft.VisualStudio.TestTools.UnitTesting; -using Newtonsoft.Json; -using Newtonsoft.Json.Converters; -using Newtonsoft.Json.Linq; -using static BO4E.BoMapper; - -namespace TestBO4E -{ - [TestClass] - public class TestBoMapper - { - [TestMethod] - public void TestFieldAnnotationFinder() - { - FieldInfo[] result = BoMapper.GetAnnotatedFields("Messlokation"); - Assert.IsTrue(result.Length > 0); - } - - [TestMethod] - public void TestBoMapping() - { - string[] files = Directory.GetFiles($"BoMapperTests/", "*.json"); - foreach (string file in files) - { - JObject json; - using (StreamReader r = new StreamReader(file)) - { - string jsonString = r.ReadToEnd(); - json = JsonConvert.DeserializeObject(jsonString); - } - Assert.IsNotNull(json["objectName"], $"You have to specify the object name in test file {file}"); - LenientParsing lenients = LenientParsing.Strict; // default - if (json["lenientDateTime"] != null && (bool)json["lenientDateTime"]) - { - lenients |= LenientParsing.DateTime; - } - - if (json["lenientEnumList"] != null && (bool)json["lenientEnumList"]) - { - lenients |= LenientParsing.EnumList; - } - - if (json["lenientBo4eUri"] != null && (bool)json["lenientBo4eUri"]) - { - lenients |= LenientParsing.Bo4eUri; - } - - BusinessObject bo; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; + +using BO4E; +using BO4E.BO; +using BO4E.COM; +using BO4E.meta.LenientConverters; +//using BO4E.Extensions; +using Microsoft.VisualStudio.TestTools.UnitTesting; + +using Newtonsoft.Json; +using Newtonsoft.Json.Converters; +using Newtonsoft.Json.Linq; + +namespace TestBO4E +{ + [TestClass] + public class TestBoMapper + { + [TestMethod] + public void TestBoMapping() + { + string[] files = Directory.GetFiles($"BoMapperTests/", "*.json"); + foreach (string file in files) + { + JObject json; + using (StreamReader r = new StreamReader(file)) + { + string jsonString = r.ReadToEnd(); + json = JsonConvert.DeserializeObject(jsonString); + } + Assert.IsNotNull(json["objectName"], $"You have to specify the object name in test file {file}"); + LenientParsing lenients = LenientParsing.Strict; // default + if (json["lenientDateTime"] != null && (bool)json["lenientDateTime"]) + { + lenients |= LenientParsing.DateTime; + } + + if (json["lenientEnumList"] != null && (bool)json["lenientEnumList"]) + { + lenients |= LenientParsing.EnumList; + } + + if (json["lenientBo4eUri"] != null && (bool)json["lenientBo4eUri"]) + { + lenients |= LenientParsing.Bo4eUri; + } + + if (json["lenientStringToInt"] != null && (bool)json["lenientStringToInt"]) + { + lenients |= LenientParsing.StringToInt; + } + BusinessObject bo; try - { - bo = JsonConvert.DeserializeObject(json["input"].ToString(), BoMapper.GetJsonSerializerSettings(lenients)); + { + bo = JsonConvert.DeserializeObject(json["input"].ToString(), lenients.GetJsonSerializerSettings()); } catch (Exception e) when (e is ArgumentException || e is JsonSerializationException) { bo = BoMapper.MapObject(json["objectName"].ToString(), (JObject)json["input"], lenients); - } - string regularOutputString = JsonConvert.SerializeObject(bo, new StringEnumConverter()); - if (bo.GetType() == typeof(Rechnung)) - { - continue; // todo: fix this! - } - /*if (json["input"]["boTyp"] != null) - { - //BusinessObject bo2 = BoMapper.MapObject((JObject)json["input"], lenients); - BusinessObject bo2 = JsonConvert.DeserializeObject(json["input"].ToString(), BoMapper.GetJsonSerializerSettings(lenients)); - //string regularOutputString2 = JsonConvert.SerializeObject(bo2, new StringEnumConverter()); - Assert.AreEqual(bo, bo2); - switch (json["input"]["boTyp"].ToString().ToLower()) - { - case "energiemenge": - //Assert.AreEqual((Energiemenge)bo, BoMapper.MapObject((JObject)json["input"], lenients)); - Assert.AreEqual((Energiemenge)bo, JsonConvert.DeserializeObject(json["input"].ToString(), BoMapper.GetJsonSerializerSettings(lenients))); - break; - case "messlokation": - //Assert.AreEqual((Messlokation)bo, BoMapper.MapObject((JObject)json["input"], lenients)); - Assert.AreEqual((Messlokation)bo, JsonConvert.DeserializeObject(json["input"].ToString(), BoMapper.GetJsonSerializerSettings(lenients))); - break; - // add more if you feel like - } - }*/ - HashSet whitelist; - if (json["userPropWhiteList"] != null) - { - whitelist = new HashSet(JArray.FromObject(json["userPropWhiteList"]).ToObject>()); - } - else - { - whitelist = new HashSet(); - } - if (lenients == LenientParsing.Strict) - { - foreach (LenientParsing lenient in Enum.GetValues(typeof(LenientParsing))) - { - // strict mappings must also work with lenient mapping - BusinessObject boLenient; + } + string regularOutputString = JsonConvert.SerializeObject(bo, new StringEnumConverter()); + if (bo.GetType() == typeof(Rechnung)) + { + continue; // todo: fix this! + } + /*if (json["input"]["boTyp"] != null) + { + //BusinessObject bo2 = BoMapper.MapObject((JObject)json["input"], lenients); + BusinessObject bo2 = JsonConvert.DeserializeObject(json["input"].ToString(), BoMapper.GetJsonSerializerSettings(lenients)); + //string regularOutputString2 = JsonConvert.SerializeObject(bo2, new StringEnumConverter()); + Assert.AreEqual(bo, bo2); + switch (json["input"]["boTyp"].ToString().ToLower()) + { + case "energiemenge": + //Assert.AreEqual((Energiemenge)bo, BoMapper.MapObject((JObject)json["input"], lenients)); + Assert.AreEqual((Energiemenge)bo, JsonConvert.DeserializeObject(json["input"].ToString(), BoMapper.GetJsonSerializerSettings(lenients))); + break; + case "messlokation": + //Assert.AreEqual((Messlokation)bo, BoMapper.MapObject((JObject)json["input"], lenients)); + Assert.AreEqual((Messlokation)bo, JsonConvert.DeserializeObject(json["input"].ToString(), BoMapper.GetJsonSerializerSettings(lenients))); + break; + // add more if you feel like + } + }*/ + HashSet whitelist; + if (json["userPropWhiteList"] != null) + { + whitelist = new HashSet(JArray.FromObject(json["userPropWhiteList"]).ToObject>()); + } + else + { + whitelist = new HashSet(); + } + if (lenients == LenientParsing.Strict) + { + foreach (LenientParsing lenient in Enum.GetValues(typeof(LenientParsing))) + { + // strict mappings must also work with lenient mapping + BusinessObject boLenient; try { - boLenient = JsonConvert.DeserializeObject(json["input"].ToString(), BoMapper.GetJsonSerializerSettings(whitelist, lenient)); + boLenient = JsonConvert.DeserializeObject(json["input"].ToString(), lenient.GetJsonSerializerSettings(whitelist)); } catch (ArgumentException) { boLenient = BoMapper.MapObject(json["objectName"].ToString(), (JObject)json["input"], whitelist, lenient); - } - string dateLenietOutputString = JsonConvert.SerializeObject(boLenient, new StringEnumConverter()); - //if (whitelist.Count ==0) { - Assert.AreEqual(regularOutputString, dateLenietOutputString); - //} - //else - // { - // Assert.AreEqual(regularOutputString, dateLenietOutputString); - //} - } - } - else - { - // non-strict test cases are designed such that they are not parseble in strict mode. - // bool exceptionThrown; - // try - //{ - // BusinessObject boStrict = BoMapper.MapObject(json["objectName"].ToString(), (JObject)json["input"], LenientParsing.Strict); - // exceptionThrown = false; - //} - //catch (Exception) - //{ - // exceptionThrown = true; - // } - //Assert.IsTrue(exceptionThrown); - } - } - } - - [TestMethod] - public void TestVertragQuickFix() - { - JObject json; - using (StreamReader r = new StreamReader("BoMapperTests/vertragLokationsIdUp.json")) - { - string jsonString = r.ReadToEnd(); - json = JsonConvert.DeserializeObject(jsonString); - } - var v = JsonConvert.DeserializeObject(json["input"].ToString(), BoMapper.GetJsonSerializerSettings(LenientParsing.MOST_LENIENT)); - Assert.IsNotNull(v.vertragsteile); - Assert.AreEqual("DE54321", v.vertragsteile.First().lokation); - } - - [TestMethod] - public void TestSummerTimeBug() - { - // first test serialization of complete business object - JObject json; - using (StreamReader r = new StreamReader("BoMapperTests/energiemenge_sommerzeit_bug.json")) - { - string jsonString = r.ReadToEnd(); - json = JsonConvert.DeserializeObject(jsonString); - } - Energiemenge em = JsonConvert.DeserializeObject(json["input"].ToString(), BoMapper.GetJsonSerializerSettings(LenientParsing.MOST_LENIENT)); - if (TimeZoneInfo.Local == Verbrauch.CENTRAL_EUROPE_STANDARD_TIME) - { - Assert.AreEqual(2, em.energieverbrauch.Count); // weil 2 verschiedene status - } - } - - [TestMethod] - public void TestProfDecimalsVerbrauchBug() - { - // first test serialization of complete business object - JObject json; - using (StreamReader r = new StreamReader("BoMapperTests/energiemenge_profdecimal_verbrauch_bug.json")) - { - string jsonString = r.ReadToEnd(); - json = JsonConvert.DeserializeObject(jsonString); - } - Energiemenge em = JsonConvert.DeserializeObject(json["input"].ToString(), BoMapper.GetJsonSerializerSettings(LenientParsing.MOST_LENIENT)); - Assert.AreEqual(4, em.energieverbrauch.Count); - Assert.AreEqual(59.0M, em.energieverbrauch[0].wert); - Assert.AreEqual(58.0M, em.energieverbrauch[1].wert); - Assert.AreEqual(57.0M, em.energieverbrauch[2].wert); - Assert.AreEqual(57.123M, em.energieverbrauch[3].wert); - } - - [TestMethod] - public void TestProfDecimalsEnergiemengeBug() - { - // first test serialization of complete business object - JObject json; - using (StreamReader r = new StreamReader("BoMapperTests/energiemenge_profdecimal_em_bug.json")) - { - string jsonString = r.ReadToEnd(); - json = JsonConvert.DeserializeObject(jsonString); - } - Energiemenge em = JsonConvert.DeserializeObject(json["input"].ToString(), BoMapper.GetJsonSerializerSettings(LenientParsing.MOST_LENIENT)); - Assert.AreEqual(1.375000M, em.energieverbrauch.First().wert); - Assert.AreEqual(1.2130000M, em.energieverbrauch.Last().wert); - } - - [TestMethod] - public void TestSapTimeZoneUserProperties() - { - Verbrauch v1 = JsonConvert.DeserializeObject("{\"startdatum\":\"2019-03-30T02:45:00\",\"enddatum\":\"2019-03-30T03:15:00\",\"wertermittlungsverfahren\":1,\"obiskennzahl\":\"1-0:1.29.0\",\"wert\":0.0,\"einheit\":1,\"zw\":\"000000000030000301\",\"Status\":\"IU015\",\"sap_timezone\":\"CET\"}"); - Assert.AreEqual(DateTimeKind.Utc, v1.startdatum.Kind); - Assert.AreEqual(DateTimeKind.Utc, v1.enddatum.Kind); - Assert.AreEqual(2.75, v1.startdatum.TimeOfDay.TotalHours); - Assert.AreEqual(3.25, v1.enddatum.TimeOfDay.TotalHours); - - Verbrauch v2 = JsonConvert.DeserializeObject("{\"startdatum\":\"2019-03-30T02:45:00\",\"enddatum\":\"2019-03-30T03:15:00\",\"wertermittlungsverfahren\":1,\"obiskennzahl\":\"1-0:1.29.0\",\"wert\":0.0,\"einheit\":1,\"zw\":\"000000000030000301\",\"Status\":\"IU015\",\"sap_timezone\":\"UTC\"}"); - Assert.AreEqual(DateTimeKind.Utc, v2.startdatum.Kind); - Assert.AreEqual(DateTimeKind.Utc, v2.enddatum.Kind); - Assert.AreEqual(2.75, v2.startdatum.TimeOfDay.TotalHours); - Assert.AreEqual(3.25, v2.enddatum.TimeOfDay.TotalHours); - - Verbrauch v3 = JsonConvert.DeserializeObject("{\"startdatum\":\"2019-10-27T02:30:00\",\"enddatum\":\"2019-10-27T02:45:00\",\"wertermittlungsverfahren\":1,\"obiskennzahl\":\"1-0:1.29.0\",\"wert\":0.0,\"einheit\":1,\"zw\":\"000000000030000301\",\"Status\":\"IU015\",\"sap_timezone\":\"CEST\"}"); - Assert.AreEqual(DateTimeKind.Utc, v3.startdatum.Kind); - Assert.AreEqual(DateTimeKind.Utc, v3.enddatum.Kind); - Assert.AreEqual(2.5, v3.startdatum.TimeOfDay.TotalHours); - Assert.AreEqual(2.75, v3.enddatum.TimeOfDay.TotalHours); - - Verbrauch v4 = JsonConvert.DeserializeObject("{\"startdatum\":\"2019-10-27T02:45:00\",\"enddatum\":\"2019-10-27T03:15:00\",\"wertermittlungsverfahren\":1,\"obiskennzahl\":\"1-0:1.29.0\",\"wert\":0.0,\"einheit\":1,\"zw\":\"000000000030000301\",\"Status\":\"IU015\",\"sap_timezone\":\"CEST\"}"); - Assert.AreEqual(DateTimeKind.Utc, v4.startdatum.Kind); - Assert.AreEqual(DateTimeKind.Utc, v4.enddatum.Kind); - Assert.AreEqual(2.75, v4.startdatum.TimeOfDay.TotalHours); - Assert.AreEqual(3.25, v4.enddatum.TimeOfDay.TotalHours); - } - - [TestMethod] - public void TestSommerzeitumstellung() - { - // endzeitpunkt wird im sap aus startzeitpunkt + 1 std zusammengesetzt. bei umstellung auf sommerzeit entsteht als artefakt ein shift - Verbrauch v1 = JsonConvert.DeserializeObject("{\"zw\":\"000000000020720475\",\"startdatum\":\"201903310100\",\"enddatum\":\"201903310300\",\"wert\":263,\"status\":\"IU021\",\"obiskennzahl\":\"7-10:99.33.17\",\"wertermittlungsverfahren\":\"MESSUNG\",\"einheit\":\"KWH\",\"sap_timezone\":\"CET\"}", - new LenientDateTimeConverter()); - Assert.AreEqual(new DateTime(2019, 3, 31, 2, 0, 0, DateTimeKind.Utc), v1.enddatum); - - // negativ test: nur in der sommerzeit soll das nicht passieren - Verbrauch v2 = JsonConvert.DeserializeObject("{\"zw\":\"000000000020720475\",\"startdatum\":\"201905310100\",\"enddatum\":\"201905310300\",\"wert\":263,\"status\":\"IU021\",\"obiskennzahl\":\"7-10:99.33.17\",\"wertermittlungsverfahren\":\"MESSUNG\",\"einheit\":\"KWH\",\"sap_timezone\":\"CET\"}", - new LenientDateTimeConverter()); - Assert.AreEqual(new DateTime(2019, 5, 31, 3, 0, 0, DateTimeKind.Utc), v2.enddatum); - - // negativ test: nur in der winterzeit soll das nicht passieren - Verbrauch v3 = JsonConvert.DeserializeObject("{\"zw\":\"000000000020720475\",\"startdatum\":\"201901310100\",\"enddatum\":\"201901310300\",\"wert\":263,\"status\":\"IU021\",\"obiskennzahl\":\"7-10:99.33.17\",\"wertermittlungsverfahren\":\"MESSUNG\",\"einheit\":\"KWH\",\"sap_timezone\":\"CET\"}", - new LenientDateTimeConverter()); - Assert.AreEqual(new DateTime(2019, 1, 31, 3, 0, 0, DateTimeKind.Utc), v3.enddatum); - } - - - [TestMethod] - public void TestBoNames() - { - HashSet testResult = BoMapper.GetValidBoNames(); - Assert.IsTrue(testResult.Contains("Messlokation")); - Assert.IsTrue(testResult.Contains("Energiemenge")); - Assert.IsFalse(testResult.Contains("Verbrauch"), "No COM"); - Assert.IsFalse(testResult.Contains("CompletenessReport")); // has moved to extensions - Assert.IsFalse(testResult.Contains("Mengeneinheit"), "No enums"); - } - - [TestMethod] - public void TestBoNameTyping() - { - Assert.AreEqual(typeof(Benachrichtigung), BoMapper.GetTypeForBoName("Benachrichtigung")); - Assert.AreEqual(typeof(Benachrichtigung), BoMapper.GetTypeForBoName("bEnAcHriCHTIGuNg")); - - bool nullExceptionThrown = false; - try - { - BoMapper.GetTypeForBoName(null); - } - catch (ArgumentNullException) - { - nullExceptionThrown = true; - } - Assert.IsTrue(nullExceptionThrown, "null as argument must result in a ArgumentNullException"); - - /* - bool argumentExceptionThrown = false; - try - { - BoMapper.GetTypeForBoName("dei mudder ihr business object"); - } - catch (ArgumentException) - { - argumentExceptionThrown = true; - } - Assert.IsTrue(argumentExceptionThrown, "invalid argument must result in a ArgumentException"); - */ - Assert.IsNull(BoMapper.GetTypeForBoName("dei mudder ihr business object"), "invalid business object names must result in null"); - } - - /* // has moved to extensions - [TestMethod] - public void TestJsonSchemeGeneration() - { - Assert.IsNotNull(BoMapper.GetJsonSchemeFor("Messlokation")); - Assert.IsNull(BoMapper.GetJsonSchemeFor("Schwurbeldings")); - Newtonsoft.Json.Schema.JSchema crScheme = BoMapper.GetJsonSchemeFor("CompletenessReport"); - Assert.IsTrue(crScheme.ToString().Count() > 100); - } - */ - - [TestMethod] - public void TestNullableDateTimeDeserialization() - { - Aufgabe a = JsonConvert.DeserializeObject("{\"ccat\":\"ZE01\",\"casenr\":\"470272\",\"objtype\":\"ZISUPROFIL\",\"aufgabenId\":\"REIMPORT\",\"ausgefuehrt\":\"false\",\"ausfuehrender\":\"\",\"ausfuehrungszeitpunkt\":\"0000-00-00T00:00:00Z\"}"); - Assert.IsNotNull(a); - Assert.IsFalse(a.ausfuehrungszeitpunkt.HasValue); - - Aufgabe b = JsonConvert.DeserializeObject("{\"ccat\":\"ZE01\",\"casenr\":\"470272\",\"objtype\":\"ZISUPROFIL\",\"aufgabenId\":\"REIMPORT\",\"ausgefuehrt\":\"false\",\"ausfuehrender\":\"\",\"ausfuehrungszeitpunkt\":\"2019-07-10T11:52:59Z\"}"); - Assert.IsNotNull(b); - Assert.IsTrue(b.ausfuehrungszeitpunkt.HasValue); - } - } -} + } + catch (JsonSerializationException jse) + { + Assert.IsTrue(false, $"Unexpected {nameof(JsonSerializationException)} in file {file}: {jse.Message}"); + throw jse; + } + //string dateLenietOutputString = JsonConvert.SerializeObject(boLenient, new StringEnumConverter()); + //if (whitelist.Count ==0) { + //Assert.AreEqual(regularOutputString, dateLenietOutputString); + //} + //else + // { + // Assert.AreEqual(regularOutputString, dateLenietOutputString); + //} + } + } + else + { + // non-strict test cases are designed such that they are not parseble in strict mode. + // bool exceptionThrown; + // try + //{ + // BusinessObject boStrict = BoMapper.MapObject(json["objectName"].ToString(), (JObject)json["input"], LenientParsing.Strict); + // exceptionThrown = false; + //} + //catch (Exception) + //{ + // exceptionThrown = true; + // } + //Assert.IsTrue(exceptionThrown); + } + } + } + + [TestMethod] + public void TestVertragQuickFix() + { + JObject json; + using (StreamReader r = new StreamReader("BoMapperTests/vertragLokationsIdUp.json")) + { + string jsonString = r.ReadToEnd(); + json = JsonConvert.DeserializeObject(jsonString); + } + var v = JsonConvert.DeserializeObject(json["input"].ToString(), LenientParsing.MOST_LENIENT.GetJsonSerializerSettings()); + Assert.IsNotNull(v.Vertragsteile); + Assert.AreEqual("DE54321", v.Vertragsteile.First().Lokation); + } + + [TestMethod] + public void TestSummerTimeBug() + { + // first test serialization of complete business object + JObject json; + using (StreamReader r = new StreamReader("BoMapperTests/energiemenge_sommerzeit_bug.json")) + { + string jsonString = r.ReadToEnd(); + json = JsonConvert.DeserializeObject(jsonString); + } + Energiemenge em = JsonConvert.DeserializeObject(json["input"].ToString(), LenientParsing.MOST_LENIENT.GetJsonSerializerSettings()); + if (TimeZoneInfo.Local == Verbrauch.CENTRAL_EUROPE_STANDARD_TIME) + { + Assert.AreEqual(2, em.Energieverbrauch.Count); // weil 2 verschiedene status + } + } + + [TestMethod] + public void TestVertragStringToInt() + { + // first test serialization of complete business object + JObject json; + using (StreamReader r = new StreamReader("BoMapperTests/Vertrag_lenient_String.json")) + { + string jsonString = r.ReadToEnd(); + json = JsonConvert.DeserializeObject(jsonString); + } + LenientParsing lenients = LenientParsing.StringToInt; + Vertrag v = JsonConvert.DeserializeObject(json["input"].ToString(), lenients.GetJsonSerializerSettings()); + Assert.AreEqual(v.Vertragskonditionen.AnzahlAbschlaege, 12); + } + + [TestMethod] + public void TestProfDecimalsVerbrauchBug() + { + // first test serialization of complete business object + JObject json; + using (StreamReader r = new StreamReader("BoMapperTests/energiemenge_profdecimal_verbrauch_bug.json")) + { + string jsonString = r.ReadToEnd(); + json = JsonConvert.DeserializeObject(jsonString); + } + Energiemenge em = JsonConvert.DeserializeObject(json["input"].ToString(), LenientParsing.MOST_LENIENT.GetJsonSerializerSettings()); + Assert.AreEqual(4, em.Energieverbrauch.Count); + Assert.AreEqual(59.0M, em.Energieverbrauch[0].Wert); + Assert.AreEqual(58.0M, em.Energieverbrauch[1].Wert); + Assert.AreEqual(57.0M, em.Energieverbrauch[2].Wert); + Assert.AreEqual(57.123M, em.Energieverbrauch[3].Wert); + } + + [TestMethod] + public void TestProfDecimalsEnergiemengeBug() + { + // first test serialization of complete business object + JObject json; + using (StreamReader r = new StreamReader("BoMapperTests/energiemenge_profdecimal_em_bug.json")) + { + string jsonString = r.ReadToEnd(); + json = JsonConvert.DeserializeObject(jsonString); + } + Energiemenge em = JsonConvert.DeserializeObject(json["input"].ToString(), LenientParsing.MOST_LENIENT.GetJsonSerializerSettings()); + Assert.AreEqual(1.375000M, em.Energieverbrauch.First().Wert); + Assert.AreEqual(1.2130000M, em.Energieverbrauch.Last().Wert); + } + + [TestMethod] + public void TestSapTimeZoneUserProperties() + { + Verbrauch v1 = JsonConvert.DeserializeObject("{\"startdatum\":\"2019-03-30T02:45:00\",\"enddatum\":\"2019-03-30T03:15:00\",\"wertermittlungsverfahren\":1,\"obiskennzahl\":\"1-0:1.29.0\",\"wert\":0.0,\"einheit\":1,\"zw\":\"000000000030000301\",\"Status\":\"IU015\",\"sap_timezone\":\"CET\"}"); + Assert.AreEqual(DateTimeKind.Utc, v1.Startdatum.Kind); + Assert.AreEqual(DateTimeKind.Utc, v1.Enddatum.Kind); + Assert.AreEqual(2.75, v1.Startdatum.TimeOfDay.TotalHours); + Assert.AreEqual(3.25, v1.Enddatum.TimeOfDay.TotalHours); + + Verbrauch v2 = JsonConvert.DeserializeObject("{\"startdatum\":\"2019-03-30T02:45:00\",\"enddatum\":\"2019-03-30T03:15:00\",\"wertermittlungsverfahren\":1,\"obiskennzahl\":\"1-0:1.29.0\",\"wert\":0.0,\"einheit\":1,\"zw\":\"000000000030000301\",\"Status\":\"IU015\",\"sap_timezone\":\"UTC\"}"); + Assert.AreEqual(DateTimeKind.Utc, v2.Startdatum.Kind); + Assert.AreEqual(DateTimeKind.Utc, v2.Enddatum.Kind); + Assert.AreEqual(2.75, v2.Startdatum.TimeOfDay.TotalHours); + Assert.AreEqual(3.25, v2.Enddatum.TimeOfDay.TotalHours); + + Verbrauch v3 = JsonConvert.DeserializeObject("{\"startdatum\":\"2019-10-27T02:30:00\",\"enddatum\":\"2019-10-27T02:45:00\",\"wertermittlungsverfahren\":1,\"obiskennzahl\":\"1-0:1.29.0\",\"wert\":0.0,\"einheit\":1,\"zw\":\"000000000030000301\",\"Status\":\"IU015\",\"sap_timezone\":\"CEST\"}"); + Assert.AreEqual(DateTimeKind.Utc, v3.Startdatum.Kind); + Assert.AreEqual(DateTimeKind.Utc, v3.Enddatum.Kind); + Assert.AreEqual(2.5, v3.Startdatum.TimeOfDay.TotalHours); + Assert.AreEqual(2.75, v3.Enddatum.TimeOfDay.TotalHours); + + Verbrauch v4 = JsonConvert.DeserializeObject("{\"startdatum\":\"2019-10-27T02:45:00\",\"enddatum\":\"2019-10-27T03:15:00\",\"wertermittlungsverfahren\":1,\"obiskennzahl\":\"1-0:1.29.0\",\"wert\":0.0,\"einheit\":1,\"zw\":\"000000000030000301\",\"Status\":\"IU015\",\"sap_timezone\":\"CEST\"}"); + Assert.AreEqual(DateTimeKind.Utc, v4.Startdatum.Kind); + Assert.AreEqual(DateTimeKind.Utc, v4.Enddatum.Kind); + Assert.AreEqual(2.75, v4.Startdatum.TimeOfDay.TotalHours); + Assert.AreEqual(3.25, v4.Enddatum.TimeOfDay.TotalHours); + } + + [TestMethod] + public void TestSommerzeitumstellung() + { + // endzeitpunkt wird im sap aus startzeitpunkt + 1 std zusammengesetzt. bei umstellung auf sommerzeit entsteht als artefakt ein shift + Verbrauch v1 = JsonConvert.DeserializeObject("{\"zw\":\"000000000020720475\",\"startdatum\":\"201903310100\",\"enddatum\":\"201903310300\",\"wert\":263,\"status\":\"IU021\",\"obiskennzahl\":\"7-10:99.33.17\",\"wertermittlungsverfahren\":\"MESSUNG\",\"einheit\":\"KWH\",\"sap_timezone\":\"CET\"}", + new LenientDateTimeConverter()); + Assert.AreEqual(new DateTime(2019, 3, 31, 2, 0, 0, DateTimeKind.Utc), v1.Enddatum); + + // negativ test: nur in der sommerzeit soll das nicht passieren + Verbrauch v2 = JsonConvert.DeserializeObject("{\"zw\":\"000000000020720475\",\"startdatum\":\"201905310100\",\"enddatum\":\"201905310300\",\"wert\":263,\"status\":\"IU021\",\"obiskennzahl\":\"7-10:99.33.17\",\"wertermittlungsverfahren\":\"MESSUNG\",\"einheit\":\"KWH\",\"sap_timezone\":\"CET\"}", + new LenientDateTimeConverter()); + Assert.AreEqual(new DateTime(2019, 5, 31, 3, 0, 0, DateTimeKind.Utc), v2.Enddatum); + + // negativ test: nur in der winterzeit soll das nicht passieren + Verbrauch v3 = JsonConvert.DeserializeObject("{\"zw\":\"000000000020720475\",\"startdatum\":\"201901310100\",\"enddatum\":\"201901310300\",\"wert\":263,\"status\":\"IU021\",\"obiskennzahl\":\"7-10:99.33.17\",\"wertermittlungsverfahren\":\"MESSUNG\",\"einheit\":\"KWH\",\"sap_timezone\":\"CET\"}", + new LenientDateTimeConverter()); + Assert.AreEqual(new DateTime(2019, 1, 31, 3, 0, 0, DateTimeKind.Utc), v3.Enddatum); + } + + + [TestMethod] + public void TestBoNames() + { + HashSet testResult = BoMapper.GetValidBoNames(); + Assert.IsTrue(testResult.Contains("Messlokation")); + Assert.IsTrue(testResult.Contains("Energiemenge")); + Assert.IsFalse(testResult.Contains("Verbrauch"), "No COM"); + Assert.IsFalse(testResult.Contains("CompletenessReport")); // has moved to extensions + Assert.IsFalse(testResult.Contains("Mengeneinheit"), "No enums"); + } + + [TestMethod] + public void TestBoNameTyping() + { + Assert.AreEqual(typeof(Benachrichtigung), BoMapper.GetTypeForBoName("Benachrichtigung")); + Assert.AreEqual(typeof(Benachrichtigung), BoMapper.GetTypeForBoName("bEnAcHriCHTIGuNg")); + + Assert.ThrowsException(() => BoMapper.GetTypeForBoName(null), "null as argument must result in a ArgumentNullException"); + /* + bool argumentExceptionThrown = false; + try + { + BoMapper.GetTypeForBoName("dei mudder ihr business object"); + } + catch (ArgumentException) + { + argumentExceptionThrown = true; + } + Assert.IsTrue(argumentExceptionThrown, "invalid argument must result in a ArgumentException"); + */ + Assert.IsNull(BoMapper.GetTypeForBoName("dei mudder ihr business object"), "invalid business object names must result in null"); + } + + /* // has moved to extensions + [TestMethod] + public void TestJsonSchemeGeneration() + { + Assert.IsNotNull(BoMapper.GetJsonSchemeFor("Messlokation")); + Assert.IsNull(BoMapper.GetJsonSchemeFor("Schwurbeldings")); + Newtonsoft.Json.Schema.JSchema crScheme = BoMapper.GetJsonSchemeFor("CompletenessReport"); + Assert.IsTrue(crScheme.ToString().Count() > 100); + } + */ + + [TestMethod] + public void TestNullableDateTimeDeserialization() + { + Aufgabe a = JsonConvert.DeserializeObject("{\"ccat\":\"ZE01\",\"casenr\":\"470272\",\"objtype\":\"ZISUPROFIL\",\"aufgabenId\":\"REIMPORT\",\"ausgefuehrt\":\"false\",\"ausfuehrender\":\"\",\"ausfuehrungszeitpunkt\":\"0000-00-00T00:00:00Z\"}"); + Assert.IsNotNull(a); + Assert.IsFalse(a.Ausfuehrungszeitpunkt.HasValue); + + Aufgabe b = JsonConvert.DeserializeObject("{\"ccat\":\"ZE01\",\"casenr\":\"470272\",\"objtype\":\"ZISUPROFIL\",\"aufgabenId\":\"REIMPORT\",\"ausgefuehrt\":\"false\",\"ausfuehrender\":\"\",\"ausfuehrungszeitpunkt\":\"2019-07-10T11:52:59Z\"}"); + Assert.IsNotNull(b); + Assert.IsTrue(b.Ausfuehrungszeitpunkt.HasValue); + } + } +} diff --git a/BO4ETestProject/TestCOMValidity.cs b/BO4ETestProject/TestCOMValidity.cs index 7bab3dc8..dd9ca002 100644 --- a/BO4ETestProject/TestCOMValidity.cs +++ b/BO4ETestProject/TestCOMValidity.cs @@ -14,11 +14,11 @@ public void TestVerbrauch() Assert.IsFalse(v1.IsValid()); Verbrauch v2 = new Verbrauch { - startdatum = new DateTime(), - enddatum = new DateTime(), - einheit = BO4E.ENUM.Mengeneinheit.ANZAHL, - wert = (decimal)123.456, - obiskennzahl = "asd" + Startdatum = new DateTime(), + Enddatum = new DateTime(), + Einheit = BO4E.ENUM.Mengeneinheit.ANZAHL, + Wert = (decimal)123.456, + Obiskennzahl = "asd" }; Assert.IsTrue(v2.IsValid()); } diff --git a/BO4ETestProject/TestEnergiemengeAdding.cs b/BO4ETestProject/TestEnergiemengeAdding.cs index df64b15c..7c93b466 100644 --- a/BO4ETestProject/TestEnergiemengeAdding.cs +++ b/BO4ETestProject/TestEnergiemengeAdding.cs @@ -13,41 +13,41 @@ public void TestSimpleAdd() { Energiemenge em1 = new Energiemenge() { - lokationsId = "DE123", - lokationstyp = BO4E.ENUM.Lokationstyp.MaLo, - energieverbrauch = new List() + LokationsId = "DE123", + LokationsTyp = BO4E.ENUM.Lokationstyp.MaLo, + Energieverbrauch = new List() { new BO4E.COM.Verbrauch() { - einheit = BO4E.ENUM.Mengeneinheit.ANZAHL, - obiskennzahl = "1-2-3", - enddatum = new DateTime(), - startdatum = new DateTime(), - wert = (decimal)123.456, - wertermittlungsverfahren= BO4E.ENUM.Wertermittlungsverfahren.PROGNOSE + Einheit = BO4E.ENUM.Mengeneinheit.ANZAHL, + Obiskennzahl = "1-2-3", + Enddatum = new DateTime(), + Startdatum = new DateTime(), + Wert = (decimal)123.456, + Wertermittlungsverfahren= BO4E.ENUM.Wertermittlungsverfahren.PROGNOSE } } }; Energiemenge em2 = new Energiemenge() { - lokationsId = "DE123", - lokationstyp = BO4E.ENUM.Lokationstyp.MaLo, - energieverbrauch = new List() + LokationsId = "DE123", + LokationsTyp = BO4E.ENUM.Lokationstyp.MaLo, + Energieverbrauch = new List() { new BO4E.COM.Verbrauch() { - einheit = BO4E.ENUM.Mengeneinheit.ANZAHL, - obiskennzahl = "4-5-6", - enddatum = new DateTime(), - startdatum = new DateTime(), - wert = (decimal)123.456, - wertermittlungsverfahren= BO4E.ENUM.Wertermittlungsverfahren.PROGNOSE + Einheit = BO4E.ENUM.Mengeneinheit.ANZAHL, + Obiskennzahl = "4-5-6", + Enddatum = new DateTime(), + Startdatum = new DateTime(), + Wert = (decimal)123.456, + Wertermittlungsverfahren= BO4E.ENUM.Wertermittlungsverfahren.PROGNOSE } } }; Energiemenge result = em1 + em2; Assert.IsNotNull(result); - Assert.AreEqual(2, result.energieverbrauch.Count); + Assert.AreEqual(2, result.Energieverbrauch.Count); } [TestMethod] @@ -55,13 +55,13 @@ public void TestIllegalAdd() { Energiemenge em1 = new Energiemenge() { - lokationsId = "DE456", - lokationstyp = BO4E.ENUM.Lokationstyp.MeLo + LokationsId = "DE456", + LokationsTyp = BO4E.ENUM.Lokationstyp.MeLo }; Energiemenge em2 = new Energiemenge() { - lokationsId = "DE789", - lokationstyp = BO4E.ENUM.Lokationstyp.MeLo + LokationsId = "DE789", + LokationsTyp = BO4E.ENUM.Lokationstyp.MeLo }; Assert.ThrowsException(() => em1 + em2); } diff --git a/BO4ETestProject/TestEqualities.cs b/BO4ETestProject/TestEqualities.cs index f977b32b..5f2a9eb9 100644 --- a/BO4ETestProject/TestEqualities.cs +++ b/BO4ETestProject/TestEqualities.cs @@ -1,9 +1,12 @@ using System; using System.Collections.Generic; + using BO4E.BO; using BO4E.COM; using BO4E.ENUM; + using Microsoft.VisualStudio.TestTools.UnitTesting; + using Newtonsoft.Json; namespace TestBO4E @@ -22,17 +25,17 @@ public void TestEqualsCOM() v1 = new Verbrauch() { - einheit = Mengeneinheit.KWH, - obiskennzahl = "1-1:1.8.0", - startdatum = new DateTime(2019, 1, 1, 0, 0, 0, DateTimeKind.Utc), - enddatum = new DateTime(2020, 1, 1, 0, 0, 0, DateTimeKind.Utc) + Einheit = Mengeneinheit.KWH, + Obiskennzahl = "1-1:1.8.0", + Startdatum = new DateTime(2019, 1, 1, 0, 0, 0, DateTimeKind.Utc), + Enddatum = new DateTime(2020, 1, 1, 0, 0, 0, DateTimeKind.Utc) }; v2 = new Verbrauch() { - einheit = Mengeneinheit.KWH, - obiskennzahl = "1-1:1.8.0", - startdatum = new DateTime(2019, 1, 1, 0, 0, 0, DateTimeKind.Utc), - enddatum = new DateTime(2020, 1, 1, 0, 0, 0, DateTimeKind.Utc) + Einheit = Mengeneinheit.KWH, + Obiskennzahl = "1-1:1.8.0", + Startdatum = new DateTime(2019, 1, 1, 0, 0, 0, DateTimeKind.Utc), + Enddatum = new DateTime(2020, 1, 1, 0, 0, 0, DateTimeKind.Utc) }; Assert.AreEqual(v1, v2); @@ -40,9 +43,9 @@ public void TestEqualsCOM() Assert.AreEqual(v1.GetHashCode(), v2.GetHashCode()); Assert.IsFalse(v1 == v2); - v2.obiskennzahl = "1-1:1.8.1"; + v2.Obiskennzahl = "1-1:1.8.1"; Assert.AreNotEqual(v1, v2); - Assert.AreNotEqual(v1.GetHashCode(), v2.GetHashCode()); + Assert.AreNotEqual(v1.GetHashCode(), v2.GetHashCode()); Assert.AreNotEqual(new Preis(), new Menge()); } @@ -53,25 +56,25 @@ public void TestEqualsBO() Energiemenge em2 = new Energiemenge(); Assert.ThrowsException(() => em1.Equals(em2)); Assert.AreEqual(em1.GetHashCode(), em2.GetHashCode()); - - em1.lokationsId = "DE1234"; - em2.lokationsId = "DE1234"; - em1.lokationstyp = BO4E.ENUM.Lokationstyp.MeLo; - em2.lokationstyp = BO4E.ENUM.Lokationstyp.MeLo; + em1.LokationsId = "DE1234"; + em2.LokationsId = "DE1234"; + + em1.LokationsTyp = BO4E.ENUM.Lokationstyp.MeLo; + em2.LokationsTyp = BO4E.ENUM.Lokationstyp.MeLo; - em1.energieverbrauch = new List(); + em1.Energieverbrauch = new List(); Verbrauch v1 = new Verbrauch { - obiskennzahl = "1-2-3-4-5" + Obiskennzahl = "1-2-3-4-5" }; - em1.energieverbrauch.Add(v1); - em2.energieverbrauch = new List(); + em1.Energieverbrauch.Add(v1); + em2.Energieverbrauch = new List(); Verbrauch v2 = new Verbrauch { - obiskennzahl = "1-2-3-4-5" + Obiskennzahl = "1-2-3-4-5" }; - em2.energieverbrauch.Add(v2); + em2.Energieverbrauch.Add(v2); Assert.AreEqual(em1, em2); //Assert.AreEqual(em1.GetHashCode(), em2.GetHashCode()); @@ -79,28 +82,28 @@ public void TestEqualsBO() Verbrauch v3 = new Verbrauch { - einheit = BO4E.ENUM.Mengeneinheit.KWH, - obiskennzahl = "ABC", - startdatum = new DateTime(2018, 1, 1), - enddatum = new DateTime(2018, 12, 31), - wert = 123.456M + Einheit = BO4E.ENUM.Mengeneinheit.KWH, + Obiskennzahl = "ABC", + Startdatum = new DateTime(2018, 1, 1), + Enddatum = new DateTime(2018, 12, 31), + Wert = 123.456M }; - em1.energieverbrauch = new List { v3 }; - em2.energieverbrauch = new List { v3 }; + em1.Energieverbrauch = new List { v3 }; + em2.Energieverbrauch = new List { v3 }; Assert.AreEqual(em1, em2); //Assert.AreEqual(em1.GetHashCode(), em2.GetHashCode()); Assert.IsFalse(em1 == em2); Verbrauch v4 = JsonConvert.DeserializeObject(JsonConvert.SerializeObject(v1)); - v4.wert = 789.012M; - em1.energieverbrauch.Add(v4); + v4.Wert = 789.012M; + em1.Energieverbrauch.Add(v4); Assert.AreNotEqual(em1, em2); - em2.energieverbrauch.Add(v4); + em2.Energieverbrauch.Add(v4); Assert.AreEqual(em1, em2); - em1.energieverbrauch = new List { v3, v4 }; - em2.energieverbrauch = new List { v4, v3 }; + em1.Energieverbrauch = new List { v3, v4 }; + em2.Energieverbrauch = new List { v4, v3 }; Assert.AreNotEqual(em1, em2); //Assert.AreNotEqual(em1.GetHashCode(), em2.GetHashCode()); diff --git a/BO4ETestProject/TestJsonSchemaGeneration.cs b/BO4ETestProject/TestJsonSchemaGeneration.cs new file mode 100644 index 00000000..63fbf55b --- /dev/null +++ b/BO4ETestProject/TestJsonSchemaGeneration.cs @@ -0,0 +1,61 @@ +using System; +using System.IO; +using System.Linq; +using System.Text; + +using BO4E.BO; + +using Microsoft.VisualStudio.TestTools.UnitTesting; + +using Newtonsoft.Json.Schema; + +namespace TestBO4E +{ + [TestClass] + public class TestJsonSchemaGeneration + { + [TestMethod] + public void BasicTest() + { + Messlokation melo = new Messlokation(); + string result; + result = melo.GetJsonScheme().ToString(); + + Energiemenge em = new Energiemenge(); + result = em.GetJsonScheme().ToString(); + + string result2 = BusinessObject.GetJsonSchema(typeof(Energiemenge)).ToString(); + Assert.AreEqual(result, result2); + } + + [TestMethod] + public void NegativeTest() + { + Assert.ThrowsException(() => BusinessObject.GetJsonSchema(typeof(string)), "Illegal types must result in a ArgumentException."); + } + + [TestMethod] + public void TestJSchemaFileGenerationBo() + { + try + { + foreach (var type in typeof(BusinessObject).Assembly.GetTypes().Where(t => t.IsSubclassOf(typeof(BusinessObject))).Reverse()) + { + var schema = BusinessObject.GetJsonSchema(type); + Assert.IsNotNull(schema); + string path = $"../../../../json-schema-files/{type}.json"; // not elegant but ok ;) + if (!File.Exists(path)) + { + var stream = File.Create(path); + stream.Close(); + } + File.WriteAllText(path, schema.ToString(SchemaVersion.Draft7), Encoding.UTF8); + } + } + catch (JSchemaException) + { + // thats life. pay for it if you'd like to :P + } + } + } +} diff --git a/BO4ETestProject/TestJsonSchemeGeneration.cs b/BO4ETestProject/TestJsonSchemeGeneration.cs deleted file mode 100644 index 4443334b..00000000 --- a/BO4ETestProject/TestJsonSchemeGeneration.cs +++ /dev/null @@ -1,39 +0,0 @@ -using System; -using BO4E.BO; -using Microsoft.VisualStudio.TestTools.UnitTesting; - -namespace TestBO4E -{ - [TestClass] - public class TestJsonSchemeGeneration - { - [TestMethod] - public void BasicTest() - { - Messlokation melo = new Messlokation(); - string result; - result = melo.GetJsonScheme().ToString(); - - Energiemenge em = new Energiemenge(); - result = em.GetJsonScheme().ToString(); - - string result2 = BusinessObject.GetJsonScheme(typeof(Energiemenge)).ToString(); - Assert.AreEqual(result, result2); - } - - [TestMethod] - public void NegativeTest() - { - bool expectionThrown = false; - try - { - BusinessObject.GetJsonScheme(typeof(string)); - } - catch (ArgumentException) - { - expectionThrown = true; - } - Assert.IsTrue(expectionThrown, "Illegal types must result in a ArgumentException."); - } - } -} diff --git a/BO4ETestProject/TestMaLoMeLoId.cs b/BO4ETestProject/TestMaLoMeLoId.cs index 3c9e9059..44f7c937 100644 --- a/BO4ETestProject/TestMaLoMeLoId.cs +++ b/BO4ETestProject/TestMaLoMeLoId.cs @@ -1,7 +1,7 @@ using BO4E.BO; using BO4E.ENUM; + using Microsoft.VisualStudio.TestTools.UnitTesting; -using Newtonsoft.Json; namespace TestBO4E { @@ -40,15 +40,15 @@ public void TestMeLoValidity() { var malo = new Marktlokation() { - marktlokationsId = "1235678901", - sparte = Sparte.STROM, - energierichtung = Energierichtung.AUSSP + MarktlokationsId = "1235678901", + Sparte = Sparte.STROM, + Energierichtung = Energierichtung.AUSSP }; Assert.IsFalse(malo.IsValid()); // because the obligatory bilanzierungsmethode is not set - malo.bilanzierungsmethode = Bilanzierungsmethode.SLP; - Assert.IsTrue(malo.IsValid(checkId:false)); // because all obligatory fields are set + malo.Bilanzierungsmethode = Bilanzierungsmethode.SLP; + Assert.IsTrue(malo.IsValid(checkId: false)); // because all obligatory fields are set Assert.IsFalse(malo.IsValid()); // but the marklokationsId is wrong - malo.marktlokationsId = "51238696781"; // matches the appropriate regex and has the right check sum + malo.MarktlokationsId = "51238696781"; // matches the appropriate regex and has the right check sum Assert.IsTrue(malo.IsValid()); } } diff --git a/BO4ETestProject/TestNotizDeserialization.cs b/BO4ETestProject/TestNotizDeserialization.cs index 65fe1045..2a365c44 100644 --- a/BO4ETestProject/TestNotizDeserialization.cs +++ b/BO4ETestProject/TestNotizDeserialization.cs @@ -14,7 +14,7 @@ public class TestNotizDeserialization public void TestMinusRemoval() { Notiz n = JsonConvert.DeserializeObject("{\"klaerfallnummer\":\"468982\",\"autor\":\"Konstantin Klein\",\"zeitpunkt\":\"2019-05-24T14:05:00Z\",\"inhalt\":\"hallo. das ist eine notiz mit einem lustigen emoji 🥝\n------------------------------------------------------------------------\",\"tdid\":\"0002\",\"tdname\":\"0000468982\",\"tdobject\":\"EMMA_CASE\"}"); - Assert.AreEqual("hallo. das ist eine notiz mit einem lustigen emoji 🥝", n.inhalt); + Assert.AreEqual("hallo. das ist eine notiz mit einem lustigen emoji 🥝", n.Inhalt); } } } diff --git a/BO4ETestProject/TestProtoFileGeneration.cs b/BO4ETestProject/TestProtoFileGeneration.cs index 62f592c2..1c4a1e79 100644 --- a/BO4ETestProject/TestProtoFileGeneration.cs +++ b/BO4ETestProject/TestProtoFileGeneration.cs @@ -1,19 +1,19 @@ - + using System; using System.Collections.Generic; using System.IO; using System.Text; -using BO4E.BO; +using BO4E.BO; using Microsoft.VisualStudio.TestTools.UnitTesting; using ProtoBuf; -namespace TestBO4E -{ - [TestClass] - public class TestProtoFileGeneration +namespace TestBO4E +{ + [TestClass] + public class TestProtoFileGeneration { static readonly HashSet PROTO_SERIALIZABLE_TYPES = new HashSet() @@ -35,17 +35,17 @@ public class TestProtoFileGeneration }; - [TestMethod] + [TestMethod] public void TestProtoGenerationBo() { foreach (var type in PROTO_SERIALIZABLE_TYPES) { - var method = typeof(Serializer).GetMethod(nameof(Serializer.GetProto), new Type[0] { }); + var method = typeof(Serializer).GetMethod(nameof(Serializer.GetProto), new Type[] { typeof(ProtoBuf.Meta.ProtoSyntax)}); method = method.MakeGenericMethod(type); Assert.IsNotNull(method); - string protoString = (string)method.Invoke(null, null); + string protoString = (string)method.Invoke(null, new object[] { ProtoBuf.Meta.ProtoSyntax.Proto3 }); Assert.IsFalse(string.IsNullOrWhiteSpace(protoString)); - string path = $"../../../../protobuf-files/{type}.proto"; // not elegant but ok ;) + string path = $"../../../../BO4E-dotnet/protobuf-files/{type}.proto"; // not elegant but ok ;) if (!File.Exists(path)) { var stream = File.Create(path); @@ -54,5 +54,5 @@ public void TestProtoGenerationBo() File.WriteAllText(path, protoString, Encoding.UTF8); } } - } -} + } +} diff --git a/BO4ETestProject/TestProtobufSerialization.cs b/BO4ETestProject/TestProtobufSerialization.cs index 988293dd..9a7d1848 100644 --- a/BO4ETestProject/TestProtobufSerialization.cs +++ b/BO4ETestProject/TestProtobufSerialization.cs @@ -1,10 +1,12 @@ using System; using System.IO; -using System.Linq; + using BO4E.BO; using BO4E.COM; + using Microsoft.VisualStudio.TestTools.UnitTesting; + using ProtoBuf; namespace TestBO4E @@ -17,25 +19,25 @@ public void TestProtobufRoundTrip() { Energiemenge em = new Energiemenge() { - lokationsId = "54321012345", - lokationstyp = BO4E.ENUM.Lokationstyp.MaLo, - energieverbrauch = new System.Collections.Generic.List() + LokationsId = "54321012345", + LokationsTyp = BO4E.ENUM.Lokationstyp.MaLo, + Energieverbrauch = new System.Collections.Generic.List() { new Verbrauch() { - einheit = BO4E.ENUM.Mengeneinheit.KWH, - wert = 10.0M, - startdatum = new DateTime(2019, 1, 1, 0, 0, 0, DateTimeKind.Utc), - enddatum = new DateTime(2019, 1, 2, 0, 0, 0, DateTimeKind.Utc), - obiskennzahl = "10:1.8.1" + Einheit = BO4E.ENUM.Mengeneinheit.KWH, + Wert = 10.0M, + Startdatum = new DateTime(2019, 1, 1, 0, 0, 0, DateTimeKind.Utc), + Enddatum = new DateTime(2019, 1, 2, 0, 0, 0, DateTimeKind.Utc), + Obiskennzahl = "10:1.8.1" }, new Verbrauch() { - einheit = BO4E.ENUM.Mengeneinheit.MWH, - wert = 23.0M, - startdatum = new DateTime(2019, 1, 2, 0, 0, 0, DateTimeKind.Utc), - enddatum = new DateTime(2019, 1, 3, 0, 0, 0, DateTimeKind.Utc), - obiskennzahl = "10:1.8.1" + Einheit = BO4E.ENUM.Mengeneinheit.MWH, + Wert = 23.0M, + Startdatum = new DateTime(2019, 1, 2, 0, 0, 0, DateTimeKind.Utc), + Enddatum = new DateTime(2019, 1, 3, 0, 0, 0, DateTimeKind.Utc), + Obiskennzahl = "10:1.8.1" } } }; @@ -58,7 +60,7 @@ public void TestProtobufRoundTrip() backStream.Seek(0, SeekOrigin.Begin); emRoundTrip = Serializer.Deserialize(backStream); } - Assert.IsNotNull(emRoundTrip.lokationsId); + Assert.IsNotNull(emRoundTrip.LokationsId); Assert.IsTrue(emRoundTrip.IsValid()); Assert.AreEqual(em, emRoundTrip); } diff --git a/BO4ETestProject/TestUserProperties.cs b/BO4ETestProject/TestUserProperties.cs index 6fdfaa9e..f28593fc 100644 --- a/BO4ETestProject/TestUserProperties.cs +++ b/BO4ETestProject/TestUserProperties.cs @@ -1,5 +1,7 @@ using BO4E.BO; + using Microsoft.VisualStudio.TestTools.UnitTesting; + using Newtonsoft.Json; namespace TestBO4E @@ -13,9 +15,9 @@ public void TestDeserialization() string meloJson = @"{'messlokationsId': 'DE0123456789012345678901234567890', 'sparte': 'STROM', 'myCustomInfo': 'some_value_not_covered_by_bo4e', 'myCustomValue': 123.456}"; var melo = JsonConvert.DeserializeObject(meloJson); Assert.IsTrue(melo.IsValid()); - Assert.IsNotNull(melo.userProperties); - Assert.AreEqual("some_value_not_covered_by_bo4e", melo.userProperties["myCustomInfo"].ToObject()); - Assert.AreEqual(123.456M, melo.userProperties["myCustomValue"].ToObject()); + Assert.IsNotNull(melo.UserProperties); + Assert.AreEqual("some_value_not_covered_by_bo4e", melo.UserProperties["myCustomInfo"].ToObject()); + Assert.AreEqual(123.456M, melo.UserProperties["myCustomValue"].ToObject()); } } diff --git a/README.md b/README.md index 4b428670..86df5a2c 100644 --- a/README.md +++ b/README.md @@ -29,32 +29,31 @@ using BO4E.ENUM; // ... var energiemenge = new Energiemenge() { - lokationsId = "DE0123456789012345678901234567890", - lokationsTyp = LokationsTyp.MeLo, - energieverbrauch = new List() + LokationsId = "DE0123456789012345678901234567890", + LokationsTyp = LokationsTyp.MeLo, + Energieverbrauch = new List() }; ``` -### Make use of built in validation methods -full source +### Make Use of Built in Validation Methods for German Location IDs ```c# using BO4E.BO; using BO4E.ENUM; // ... var malo = new Marktlokation() { - marktlokationsId = "1235678901", - sparte = Sparte.STROM, - energierichtung = Energierichtung.AUSSP + MarktlokationsId = "1235678901", + Sparte = Sparte.STROM, + Energierichtung = Energierichtung.AUSSP }; Assert.IsFalse(malo.IsValid()); // because the obligatory bilanzierungsmethode is not set malo.bilanzierungsmethode = Bilanzierungsmethode.SLP; Assert.IsTrue(malo.IsValid(checkId:false)); // because all obligatory fields are set Assert.IsFalse(malo.IsValid()); // but the marklokationsId is still wrong -malo.marktlokationsId = "51238696781"; // matches the appropriate regex and has the right check sum +malo.MarktlokationsId = "51238696781"; // matches the appropriate regex and has the right check sum Assert.IsTrue(malo.IsValid()); ``` -### Add custom fields via userProperties +### Add Custom Fields on the Fly via UserProperties ```c# using BO4E.BO; using Newtonsoft.Json; @@ -62,29 +61,29 @@ using Newtonsoft.Json; string meloJson = @"{'messlokationsId': 'DE0123456789012345678901234567890', 'sparte': 'STROM', 'myCustomInfo': 'some_value_not_covered_by_bo4e', 'myCustomValue': 123.456}"; var melo = JsonConvert.DeserializeObject(meloJson); Assert.IsTrue(melo.IsValid()); -Assert.IsNotNull(melo.userProperties); -Assert.AreEqual("some_value_not_covered_by_bo4e", melo.userProperties["myCustomInfo"].ToObject()); -Assert.AreEqual(123.456M, melo.userProperties["myCustomValue"].ToObject()); +Assert.IsNotNull(melo.UserProperties); +Assert.AreEqual("some_value_not_covered_by_bo4e", melo.UserProperties["myCustomInfo"].ToObject()); +Assert.AreEqual(123.456M, melo.UserProperties["myCustomValue"].ToObject()); ``` -### Don't write your own logic for basic operations +### Don't Write Your Own Logic for Basic Operations ```c# using BO4E.COM; using BO4E.ENUM; // ... var v1 = new Verbrauch() { - einheit = Mengeneinheit.KWH, - obiskennzahl = "1-1:1.8.0", - startdatum = new DateTime(2019, 1, 1, 0, 0, 0, DateTimeKind.Utc), - enddatum = new DateTime(2020, 1, 1, 0, 0, 0, DateTimeKind.Utc) + Einheit = Mengeneinheit.KWH, + Obiskennzahl = "1-1:1.8.0", + Startdatum = new DateTime(2019, 1, 1, 0, 0, 0, DateTimeKind.Utc), + Enddatum = new DateTime(2020, 1, 1, 0, 0, 0, DateTimeKind.Utc) }; var v2 = new Verbrauch() { - einheit = Mengeneinheit.KWH, - obiskennzahl = "1-1:1.8.0", - startdatum = new DateTime(2019, 1, 1, 0, 0, 0, DateTimeKind.Utc), - enddatum = new DateTime(2020, 1, 1, 0, 0, 0, DateTimeKind.Utc) + Einheit = Mengeneinheit.KWH, + Obiskennzahl = "1-1:1.8.0", + Startdatum = new DateTime(2019, 1, 1, 0, 0, 0, DateTimeKind.Utc), + Enddatum = new DateTime(2020, 1, 1, 0, 0, 0, DateTimeKind.Utc) }; Assert.AreEqual(v1, v2); @@ -93,11 +92,35 @@ Assert.AreEqual(v1.GetHashCode(), v2.GetHashCode()); Assert.IsFalse(v1 == v2); ``` -## Protocol-Buffer defintions -In the folder [protobuf-files](/protobuf-files) you can find autogenerated `.proto` files for all implemented Business Objects (except for those with multiple inheritance like e.g. `BO.Marktteilnehmer` or those derived from `BO.Preisblatt` which still causes headache using [protobuf-net](https://github.com/protobuf-net/protobuf-net)). +### Feature Rich Extension Packages +Using the [Hochfrequenz.BO4E.Extensions](https://www.nuget.org/packages/Hochfrequenz.BO4E.Extensions/) gives you access to powerful analysis methods for Business Objects. We present them directly as minimal working examples in executable show case tests. + +* [Energiemenge](/TestBO4E-dotnet-Extensions/ShowCaseTests/EnergiemengeShowCaseTests.cs) +* [Verbrauch](/TestBO4E-dotnet-Extensions/ShowCaseTests/VerbrauchShowCaseTests.cs) +* [CompletenessReport](/TestBO4E-dotnet-Reporting/ShowCaseTests/CompletenessReportShowCaseTests.cs) +* [Encrypted Business Objects](/TestBO4E-dotnet-Encryption/ShowCaseTests/EncryptionShowCaseTests.cs) +* [(Partially) Anonymized Business Objects](/TestBO4E-dotnet-Encryption/ShowCaseTests/AnonymizerShowCaseTests.cs) + +### Stable and Reliable Due to Good Test Coverage +(branch coverage as of 2020-04-09, not yet automated) +- ~54% in BO4E main project +- ~69% in the extensions package +- ~66% in the reporting package + +## Batteries Included +We try to make the usage of BO4E in general and this library in particular as smooth as possible. Therefore it not only includes bare C\# files but also some extra ressources that might be usefule to you. + +### PlantUML files +The folder [puml-files](puml-files) contains autogenerated PlantUML definitions for Business Objects, COMponents and ENUMs that are currently implemented in this repository. You can use the files provided in this repository or generate them on your own using [PlantUmlClassDiagramGenerator](https://github.com/pierre3/PlantUmlClassDiagramGenerator) by Hirotada Kobayashi aka pierre3. Please find instructions on how to use the tool in their repository. Please especially note that [include.puml](puml-files/include.puml) includes _all_ definitions inside just one file. + +### Easy Validation using Json.NET Schema (JSchema) +The folder [json-schema-files](json-schema-files) contains autogenerated JSON.net schemas for all Business Objects that are currently implemented in this repository. Using these schemas allows for easy, transparent and cross plattform validation of your Business Objects. (Find out more about [Json Schema](https://www.newtonsoft.com/jsonschema).) + +### Protocol-Buffer Definitions +In the folder [BO4E-dotnet/protobuf-files](BO4E-dotnet/protobuf-files) you can find autogenerated `.proto` files for all implemented Business Objects (except for those with multiple inheritance like e.g. `BO.Marktteilnehmer` or those derived from `BO.Preisblatt` which still causes headache using [protobuf-net](https://github.com/protobuf-net/protobuf-net)). The proto files are embedded into the BO4E nuget package as content files. This allows you to reference them. ## Contributing Contributions are welcome. Feel free to open a Pull Request against the develop branch of this repository. Please provide unit tests if you contribute logic beyond bare bare business object definitions. ## Hochfrequenz -[Hochfrequenz Unternehmensberatung GmbH](https://www.hochfrequenz.de) is a Mannheim based consulting company with offices in Berlin and Bremen. Based on [Kununu ratings](https://www.kununu.com/de/hochfrequenz-unternehmensberatung1) Hochfrequenz is among the most attractive employers within the German energy market. Applications of talented developers are welcome at any time! Please consider visiting our [career page](https://www.hochfrequenz.de/index.php/karriere/aktuelle-stellenausschreibungen/full-stack-entwickler) (German only) and our [Stack Overflow profile](https://stackoverflow.com/jobs/companies/hochfrequenz-unternehmensberatung-gmbh) that also contains job openings. +[Hochfrequenz Unternehmensberatung GmbH](https://www.hochfrequenz.de) is a Grünwald (near Munich) based consulting company with offices in Berlin and Bremen. According to [Kununu ratings](https://www.kununu.com/de/hochfrequenz-unternehmensberatung1) Hochfrequenz is among the most attractive employers within the German energy market. Applications of talented developers are welcome at any time! Please consider visiting our [career page](https://www.hochfrequenz.de/index.php/karriere/aktuelle-stellenausschreibungen/full-stack-entwickler) (German only) and our [Stack Overflow profile](https://stackoverflow.com/jobs/companies/hochfrequenz-unternehmensberatung-gmbh) that also contains job openings. diff --git a/TestBO4E-dotnet-Encryption/LogObject.cs b/TestBO4E-dotnet-Encryption/LogObject.cs deleted file mode 100644 index 917dc058..00000000 --- a/TestBO4E-dotnet-Encryption/LogObject.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System; -using BO4E.meta; -using Newtonsoft.Json; - -namespace BO4E.BO -{ - public class LogObject : BusinessObject - { - /// - /// unique id of the log event - /// - [BoKey] - [JsonProperty(Required = Required.Always, Order = 6)] - public string id; - - [JsonProperty(Required = Required.Always, Order = 7)] - public DateTime datetime; - - [JsonProperty(Required = Required.Always, Order = 8)] - public string logMessage; - } -} diff --git a/TestBO4E-dotnet-Encryption/ShowCaseTests/AnonymizerShowCaseTests.cs b/TestBO4E-dotnet-Encryption/ShowCaseTests/AnonymizerShowCaseTests.cs new file mode 100644 index 00000000..f79281c6 --- /dev/null +++ b/TestBO4E-dotnet-Encryption/ShowCaseTests/AnonymizerShowCaseTests.cs @@ -0,0 +1,70 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Security.Cryptography; + +using BO4E.BO; +using BO4E.COM; +using BO4E.ENUM; +using BO4E.Extensions.Encryption; + +using Microsoft.VisualStudio.TestTools.UnitTesting; + +namespace TestBO4E.ShowCaseTests +{ + [TestClass] + public class AnonymizerShowCaseTests + { + protected static readonly Energiemenge em = new Energiemenge() + { + LokationsId = "DE0123456789012345678901234567890", + LokationsTyp = Lokationstyp.MeLo, + Energieverbrauch = new List() + { + new Verbrauch() + { + Einheit = Mengeneinheit.KWH, + Startdatum = new DateTime(2020,3,1,0,0,0,DateTimeKind.Utc), + Enddatum = new DateTime(2020,3,8,0,0,0,DateTimeKind.Utc), + Wert = 456.0M, + Obiskennzahl ="1-2-3-4", + Wertermittlungsverfahren = Wertermittlungsverfahren.MESSUNG + }, + new Verbrauch() + { + Einheit = Mengeneinheit.KWH, + Startdatum = new DateTime(2020,3,25,0,0,0,DateTimeKind.Utc), + Enddatum = new DateTime(2020,4,1,0,0,0,DateTimeKind.Utc), + Wert = 123.0M, + Obiskennzahl ="5-6-7-8", + Wertermittlungsverfahren = Wertermittlungsverfahren.MESSUNG + } + } + }; + + [TestMethod] + public void ShowCaseTest() + { + Assert.IsTrue(em.IsValid()); + BO4E.StaticLogger.Logger = new Microsoft.Extensions.Logging.Debug.DebugLogger("Testlogger", (log, level) => { return true; }); + // Image there is a service provider to analyse the verbrauchs data but he shouldn't know about the location data. + // Yet it should still be possible to map the results back to my original data. So hashing seems like a good approach. + var config = new AnonymizerConfiguration(); + config.SetOption(BO4E.meta.DataCategory.POD, AnonymizerApproach.HASH); + byte[] salt = new Byte[100]; + RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider(); + rng.GetBytes(salt); + config.hashingSalt = Convert.ToBase64String(salt); // Some random but not necessarily secret salt; + Energiemenge anonymizedEm; + using (Anonymizer anon = new Anonymizer(config)) + { + anonymizedEm = anon.ApplyOperations(em); + } + Debug.WriteLine($"No one knowing only {anonymizedEm.LokationsId} actually means {em.LokationsId}"); + Assert.AreNotEqual(em.LokationsId, anonymizedEm.LokationsId); + Debug.WriteLine($"But it won't cause any problems in satellite systems because the data is still there (!=null) and the business object is still valid."); + Assert.IsNotNull(anonymizedEm.LokationsId); + Assert.IsTrue(anonymizedEm.IsValid()); + } + } +} diff --git a/TestBO4E-dotnet-Encryption/ShowCaseTests/EncryptionShowCaseTests.cs b/TestBO4E-dotnet-Encryption/ShowCaseTests/EncryptionShowCaseTests.cs new file mode 100644 index 00000000..a7e9f3b2 --- /dev/null +++ b/TestBO4E-dotnet-Encryption/ShowCaseTests/EncryptionShowCaseTests.cs @@ -0,0 +1,131 @@ +using System; +using System.Diagnostics; + +using BO4E.BO; +using BO4E.COM; +using BO4E.ENUM; +using BO4E.Extensions.Encryption; + +using Microsoft.VisualStudio.TestTools.UnitTesting; + +using Newtonsoft.Json; +using Newtonsoft.Json.Converters; + +namespace TestBO4E.ShowCaseTests +{ + [TestClass] + public class EncryptionShowCaseTests + { + protected static readonly Marktlokation maLo = new Marktlokation() + { + MarktlokationsId = "54321098765", + Sparte = Sparte.STROM, + Energierichtung = Energierichtung.AUSSP, + Bilanzierungsmethode = Bilanzierungsmethode.SLP, + Netzebene = Netzebene.NSP, + Lokationsadresse = new Adresse() + { + Postleitzahl = "82031", + Ort = "Grünwald", + Strasse = "Nördliche Münchner Straße", + Hausnummer = "27A", + Landescode = Landescode.DE, + } + }; + + [TestMethod] + public void ShowCaseTestSymmetric() + { + Assert.IsTrue(maLo.IsValid()); // as the encryption relies on serializing the BO invalid BOs cannot be encrypted. + + byte[] sharedSecret = Sodium.SecretBox.GenerateKey(); + EncryptedObject encryptedBo; + using (var encrypter = new SymmetricEncrypter(sharedSecret)) + { + encryptedBo = encrypter.Encrypt(maLo, "test case"); + } + Debug.Write(JsonConvert.SerializeObject(encryptedBo, new StringEnumConverter())); + //{ + // "boTyp": "ENCRYPTEDOBJECTAEAD", + // "versionStruktur": 1, + // "AssociatedData": "test case", + // "encryptionScheme": "SodiumSymmetricAEAD", + // "nonce": "hTbQKm/hAwY=", + // "cipherText": "iORhQsADEviVhjDP3d ... fnGfLF+AsL1F" + //} + + Marktlokation decryptedMaLo; + using (var decrypter = new SymmetricEncrypter(sharedSecret)) + { + decryptedMaLo = decrypter.Decrypt(encryptedBo); + } + Assert.AreEqual(maLo.Lokationsadresse, decryptedMaLo.Lokationsadresse); + } + + [TestMethod] + public void ShowCaseTestAsymmetric() + { + Assert.IsTrue(maLo.IsValid()); // as the encryption relies on serializing the BO invalid BOs cannot be encrypted. + + var aliceKeyPair = Sodium.PublicKeyBox.GenerateKeyPair(); + var bobKeyPair = Sodium.PublicKeyBox.GenerateKeyPair(); + + Debug.WriteLine($"Bob: Hey @Alice, this is my public key: {Convert.ToBase64String(bobKeyPair.PublicKey).Substring(10)}..."); + // Bob: Hey @Alice, this is my public key: HsGsYigFqgDouUvUW3uMYpy54DqsAxXxQ=... + + EncryptedObject encryptedBo; + using (AsymmetricEncrypter aliceEncrypter = new AsymmetricEncrypter(aliceKeyPair)) + { + encryptedBo = aliceEncrypter.Encrypt(maLo, Convert.ToBase64String(bobKeyPair.PublicKey)); + } + Debug.WriteLine($"Alice: Hey @Bob: This is my signed and encrypted BusinssObject: "); + Debug.WriteLine(JsonConvert.SerializeObject(encryptedBo, new StringEnumConverter())); + //{ + // "boTyp": "ENCRYPTEDOBJECTPUBLICKEYBOX", + // "versionStruktur": 1, + // "publicKey": "jpo2D3IK9BgPOLyXPfimfSD3u9VErT3kP5IYDMVY0Bo=", + // "encryptionScheme": "SodiumAsymmetricPublicKeyBox", + // "nonce": "KdNf7rQlQzOyajX+nMKBROce9odVuJqF", + // "cipherText": "VIYM7nZU9yTSj2tT...zWUuGbp4HphTlBlzgK" + //} + Debug.WriteLine($"Alice: And by the way, I hope you verified my fingerprint or the key itself."); + Assert.AreEqual(Convert.ToBase64String(aliceKeyPair.PublicKey), ((EncryptedObjectPublicKeyBox)encryptedBo).PublicKey, "Bob: I did, otherwise this would fail"); + + Marktlokation decryptedMaLo; + using (AsymmetricEncrypter bobsDecrypter = new AsymmetricEncrypter(bobKeyPair.PrivateKey)) + { + BusinessObject decryptedBo = bobsDecrypter.Decrypt(encryptedBo); // In case Bob had no idea what alice sent him... + Assert.IsInstanceOfType(decryptedBo, typeof(Marktlokation)); // ...now he knows. + decryptedMaLo = bobsDecrypter.Decrypt(encryptedBo); // Bob knows at compile time it's a MaLo. + } + Assert.AreEqual(maLo, decryptedMaLo); + + var eveKeyPair = Sodium.PublicKeyBox.GenerateKeyPair(); + // Eve entered the chat + EncryptedObjectPublicKeyBox manipulatedBo; + using (AsymmetricEncrypter eveEncrypter = new AsymmetricEncrypter(eveKeyPair)) + { + manipulatedBo = eveEncrypter.Encrypt(maLo, Convert.ToBase64String(bobKeyPair.PublicKey)); + } + manipulatedBo.PublicKey = Convert.ToBase64String(aliceKeyPair.PublicKey); // Eve: Never will Bob know this message is not from Alice! + Debug.WriteLine("Eve: Hey @Bob, Alice asked me to give you this BO"); + + Assert.AreEqual(Convert.ToBase64String(aliceKeyPair.PublicKey), manipulatedBo.PublicKey, "Bob: Hrm, seems like it's from Alice, indeed..."); + using (AsymmetricEncrypter bobsDecrypter = new AsymmetricEncrypter(bobKeyPair.PrivateKey)) + { + try + { + bobsDecrypter.Decrypt(manipulatedBo); + } + catch (System.Security.Cryptography.CryptographicException ce) + { + Debug.WriteLine($"Bob: @Eve: You tried to fool me! {ce.Message}"); + // As long as Bob checks that the public key stored in the Encrypted Business Object matches the public key of the expected sender he'll be fine. + } + } + } + + // This extension package also provides X509 certificate based encryption. Even 1 sender, multiple receivers with just 1 business object! + // To learn more please check out TestEncrypter.cs --> TestBOEncryption + } +} diff --git a/TestBO4E-dotnet-Encryption/TestAnonymizer.cs b/TestBO4E-dotnet-Encryption/TestAnonymizer.cs index fc2641d2..a95bd88b 100644 --- a/TestBO4E-dotnet-Encryption/TestAnonymizer.cs +++ b/TestBO4E-dotnet-Encryption/TestAnonymizer.cs @@ -153,18 +153,18 @@ public void TestAnonymizeEnergiemengeHashing() BO4E.StaticLogger.Logger = new Microsoft.Extensions.Logging.Debug.DebugLogger("Testlogger", (log, level) => { return true; }); Energiemenge em = new Energiemenge() { - lokationsId = "DE0123456789012345678901234567890", - lokationstyp = BO4E.ENUM.Lokationstyp.MeLo, - energieverbrauch = new List() + LokationsId = "DE0123456789012345678901234567890", + LokationsTyp = BO4E.ENUM.Lokationstyp.MeLo, + Energieverbrauch = new List() { new Verbrauch() { - wert = 123.456M, - wertermittlungsverfahren=BO4E.ENUM.Wertermittlungsverfahren.MESSUNG, - startdatum=new DateTime(2019,1,1,0,0,0,DateTimeKind.Utc), - enddatum = new DateTime(2019,2,1,0,0,0,DateTimeKind.Utc), - obiskennzahl="1-2-3-4", - einheit =BO4E.ENUM.Mengeneinheit.KWH + Wert = 123.456M, + Wertermittlungsverfahren=BO4E.ENUM.Wertermittlungsverfahren.MESSUNG, + Startdatum=new DateTime(2019,1,1,0,0,0,DateTimeKind.Utc), + Enddatum = new DateTime(2019,2,1,0,0,0,DateTimeKind.Utc), + Obiskennzahl="1-2-3-4", + Einheit =BO4E.ENUM.Mengeneinheit.KWH } } }; @@ -173,27 +173,27 @@ public void TestAnonymizeEnergiemengeHashing() conf.SetOption(DataCategory.USER_PROPERTIES, AnonymizerApproach.HASH); Anonymizer anonymizer = new Anonymizer(conf); var verbrauch2 = JsonConvert.DeserializeObject("{\"zw\":\"000000000000485549\",\"startdatum\":\"2018-03-24T01:45:00Z\",\"enddatum\":\"2018-03-24T02:00:00Z\",\"wert\":\"59\",\"status\":\"IU012\",\"obiskennzahl\":\"1-1:2.29.0\",\"wertermittlungsverfahren\":\"MESSUNG\",\"einheit\":\"KWH\"}"); - em.energieverbrauch.Add(verbrauch2); + em.Energieverbrauch.Add(verbrauch2); // hash everything var result = anonymizer.ApplyOperations(em); Assert.IsNotNull(result); - Assert.AreNotEqual(em.lokationsId, result.lokationsId); - Assert.IsTrue(Messlokation.ValidateId(result.lokationsId)); - Assert.AreEqual(em.energieverbrauch.Count, result.energieverbrauch.Count); - Assert.IsNotNull(result.energieverbrauch[1].userProperties["zw"]); - Assert.AreNotEqual(em.energieverbrauch[1].userProperties["zw"].Value(), result.energieverbrauch[1].userProperties["zw"].Value()); + Assert.AreNotEqual(em.LokationsId, result.LokationsId); + Assert.IsTrue(Messlokation.ValidateId(result.LokationsId)); + Assert.AreEqual(em.Energieverbrauch.Count, result.Energieverbrauch.Count); + Assert.IsNotNull(result.Energieverbrauch[1].UserProperties["zw"]); + Assert.AreNotEqual(em.Energieverbrauch[1].UserProperties["zw"].Value(), result.Energieverbrauch[1].UserProperties["zw"].Value()); Assert.IsTrue(Anonymizer.HasHashedKey(result)); // do not hash zw user property conf.unaffectedUserProperties.Add("zw"); result = anonymizer.ApplyOperations(em); Assert.IsNotNull(result); - Assert.AreNotEqual(em.lokationsId, result.lokationsId); - Assert.IsTrue(Messlokation.ValidateId(result.lokationsId)); - Assert.AreEqual(em.energieverbrauch.Count, result.energieverbrauch.Count); - Assert.IsNotNull(result.energieverbrauch[1].userProperties["zw"]); - Assert.AreEqual(em.energieverbrauch[1].userProperties["zw"].Value(), result.energieverbrauch[1].userProperties["zw"].Value()); + Assert.AreNotEqual(em.LokationsId, result.LokationsId); + Assert.IsTrue(Messlokation.ValidateId(result.LokationsId)); + Assert.AreEqual(em.Energieverbrauch.Count, result.Energieverbrauch.Count); + Assert.IsNotNull(result.Energieverbrauch[1].UserProperties["zw"]); + Assert.AreEqual(em.Energieverbrauch[1].UserProperties["zw"].Value(), result.Energieverbrauch[1].UserProperties["zw"].Value()); Assert.IsTrue(Anonymizer.HasHashedKey(result)); } @@ -203,16 +203,16 @@ public void TestAnonymizeEnergiemengeEncryptionRoundtrip() BO4E.StaticLogger.Logger = new Microsoft.Extensions.Logging.Debug.DebugLogger("Testlogger", (log, level) => { return true; }); Energiemenge em = new Energiemenge() { - lokationsId = "DE0123456789012345678901234567890", - lokationstyp = BO4E.ENUM.Lokationstyp.MeLo, - energieverbrauch = new List() + LokationsId = "DE0123456789012345678901234567890", + LokationsTyp = BO4E.ENUM.Lokationstyp.MeLo, + Energieverbrauch = new List() { new Verbrauch() { - wert = 123.456M, - wertermittlungsverfahren=BO4E.ENUM.Wertermittlungsverfahren.MESSUNG, - obiskennzahl="1-2-3-4", - einheit =BO4E.ENUM.Mengeneinheit.KWH + Wert = 123.456M, + Wertermittlungsverfahren=BO4E.ENUM.Wertermittlungsverfahren.MESSUNG, + Obiskennzahl="1-2-3-4", + Einheit =BO4E.ENUM.Mengeneinheit.KWH } } }; @@ -242,7 +242,7 @@ public void TestAnonymizeEnergiemengeEncryptionRoundtrip() decryptingAnonymizer.SetPrivateKey(keyPair.Private); decryptedEm = decryptingAnonymizer.ApplyOperations(encryptedEm); } - Assert.AreEqual(em.lokationsId, decryptedEm.lokationsId); + Assert.AreEqual(em.LokationsId, decryptedEm.LokationsId); Assert.IsFalse(Anonymizer.HasHashedKey(em)); } @@ -252,9 +252,9 @@ public void TestHashingDetectionForNonconformingString() BO4E.StaticLogger.Logger = new Microsoft.Extensions.Logging.Debug.DebugLogger("Testlogger", (log, level) => { return true; }); Energiemenge em = new Energiemenge() { - lokationsId = "asdkasldkmaslkdmas", // not identifyable as lokationsId - lokationstyp = BO4E.ENUM.Lokationstyp.MeLo, - energieverbrauch = new List() + LokationsId = "asdkasldkmaslkdmas", // not identifyable as lokationsId + LokationsTyp = BO4E.ENUM.Lokationstyp.MeLo, + Energieverbrauch = new List() }; Assert.IsFalse(Anonymizer.HasHashedKey(em)); @@ -274,11 +274,11 @@ public void TestCompletenessReportHashing() BO4E.StaticLogger.Logger = new Microsoft.Extensions.Logging.Debug.DebugLogger("Testlogger", (log, level) => { return true; }); CompletenessReport cr = new CompletenessReport() { - lokationsId = "56789012345", - coverage = 0.9M, - einheit = BO4E.ENUM.Mengeneinheit.MWH, + LokationsId = "56789012345", + Coverage = 0.9M, + Einheit = BO4E.ENUM.Mengeneinheit.MWH, wertermittlungsverfahren = BO4E.ENUM.Wertermittlungsverfahren.MESSUNG, - userProperties = new Dictionary() + UserProperties = new Dictionary() { { "anlage", "5012345678" }, { "profil", "123456" } @@ -294,12 +294,12 @@ public void TestCompletenessReportHashing() hashedReport = anonymizer.ApplyOperations(cr); } Assert.IsNotNull(hashedReport); - Assert.AreNotEqual(cr.lokationsId, hashedReport.lokationsId); - Assert.IsTrue(Marktlokation.ValidateId(hashedReport.lokationsId)); - Assert.IsNotNull(cr.userProperties["anlage"]); - Assert.AreNotEqual(cr.userProperties["anlage"].Value(), hashedReport.userProperties["anlage"].Value()); - Assert.IsNotNull(cr.userProperties["profil"]); - Assert.AreNotEqual(cr.userProperties["profil"].Value(), hashedReport.userProperties["profil"].Value()); + Assert.AreNotEqual(cr.LokationsId, hashedReport.LokationsId); + Assert.IsTrue(Marktlokation.ValidateId(hashedReport.LokationsId)); + Assert.IsNotNull(cr.UserProperties["anlage"]); + Assert.AreNotEqual(cr.UserProperties["anlage"].Value(), hashedReport.UserProperties["anlage"].Value()); + Assert.IsNotNull(cr.UserProperties["profil"]); + Assert.AreNotEqual(cr.UserProperties["profil"].Value(), hashedReport.UserProperties["profil"].Value()); conf.hashingSalt = "TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5IGhpcyByZWFzb24sIGJ1dCBieSB0aGlzIHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlciBhbmltYWxzLCB3aGljaCBpcyBhIGx1c3Qgb2YgdGhlIG1pbmQsIHRoYXQgYnkgYSBwZXJzZXZlcmFuY2Ugb2YgZGVsaWdodCBpbiB0aGUgY29udGludWVkIGFuZCBpbmRlZmF0aWdhYmxlIGdlbmVyYXRpb24gb2Yga25vd2xlZGdlLCBleGNlZWRzIHRoZSBzaG9ydCB2ZWhlbWVuY2Ugb2YgYW55IGNhcm5hbCBwbGVhc3VyZS4="; CompletenessReport saltedReport; @@ -307,12 +307,12 @@ public void TestCompletenessReportHashing() { saltedReport = anonymizer.ApplyOperations(cr); } - Assert.IsNotNull(saltedReport.lokationsId); - Assert.AreNotEqual(cr.lokationsId, saltedReport.lokationsId); - Assert.AreNotEqual(hashedReport.lokationsId, saltedReport.lokationsId); + Assert.IsNotNull(saltedReport.LokationsId); + Assert.AreNotEqual(cr.LokationsId, saltedReport.LokationsId); + Assert.AreNotEqual(hashedReport.LokationsId, saltedReport.LokationsId); - Assert.IsTrue(Anonymizer.IsHashedKey(hashedReport.lokationsId)); - Assert.IsTrue(Anonymizer.IsHashedKey(saltedReport.lokationsId)); + Assert.IsTrue(Anonymizer.IsHashedKey(hashedReport.LokationsId)); + Assert.IsTrue(Anonymizer.IsHashedKey(saltedReport.LokationsId)); } [TestMethod] @@ -321,18 +321,18 @@ public void TestSameHashDifferentObjectTypes() BO4E.StaticLogger.Logger = new Microsoft.Extensions.Logging.Debug.DebugLogger("Testlogger", (log, level) => { return true; }); Energiemenge em = new Energiemenge() { - lokationsId = "DE0123456789012345678901234567890", - lokationstyp = BO4E.ENUM.Lokationstyp.MeLo, - energieverbrauch = new List() + LokationsId = "DE0123456789012345678901234567890", + LokationsTyp = BO4E.ENUM.Lokationstyp.MeLo, + Energieverbrauch = new List() { new Verbrauch() { - wert = 123.456M, - wertermittlungsverfahren=BO4E.ENUM.Wertermittlungsverfahren.MESSUNG, - startdatum=new DateTime(2019,1,1,0,0,0,DateTimeKind.Utc), - enddatum = new DateTime(2019,2,1,0,0,0,DateTimeKind.Utc), - obiskennzahl="1-2-3-4", - einheit =BO4E.ENUM.Mengeneinheit.KWH + Wert = 123.456M, + Wertermittlungsverfahren=BO4E.ENUM.Wertermittlungsverfahren.MESSUNG, + Startdatum=new DateTime(2019,1,1,0,0,0,DateTimeKind.Utc), + Enddatum = new DateTime(2019,2,1,0,0,0,DateTimeKind.Utc), + Obiskennzahl="1-2-3-4", + Einheit =BO4E.ENUM.Mengeneinheit.KWH } } }; @@ -340,19 +340,17 @@ public void TestSameHashDifferentObjectTypes() Messlokation melo = new Messlokation() { - messlokationsId = "DE0123456789012345678901234567890" + MesslokationsId = "DE0123456789012345678901234567890" }; Assert.IsTrue(melo.IsValid()); var conf = new AnonymizerConfiguration(); conf.SetOption(DataCategory.POD, AnonymizerApproach.HASH); - using (Anonymizer anonymizer = new Anonymizer(conf)) - { - var hashedEm = anonymizer.ApplyOperations(em); - var hashedMelo = anonymizer.ApplyOperations(melo); - Assert.AreEqual(hashedEm.lokationsId, hashedMelo.messlokationsId); - } + using Anonymizer anonymizer = new Anonymizer(conf); + var hashedEm = anonymizer.ApplyOperations(em); + var hashedMelo = anonymizer.ApplyOperations(melo); + Assert.AreEqual(hashedEm.LokationsId, hashedMelo.MesslokationsId); } [TestMethod] @@ -374,10 +372,10 @@ public void TestCaginMeLos() { Messlokation melo = new Messlokation() { - messlokationsId = plaintextMeLoId + MesslokationsId = plaintextMeLoId }; var hashedMelo = anonymizer.ApplyOperations(melo); - result[plaintextMeLoId] = hashedMelo.messlokationsId; + result[plaintextMeLoId] = hashedMelo.MesslokationsId; } } var resultJson = JsonConvert.SerializeObject(result); diff --git a/TestBO4E-dotnet-Encryption/TestBO4E-dotnet-Extensions-Encryption.csproj b/TestBO4E-dotnet-Encryption/TestBO4E-dotnet-Extensions-Encryption.csproj index 37cc2434..f15e5506 100644 --- a/TestBO4E-dotnet-Encryption/TestBO4E-dotnet-Extensions-Encryption.csproj +++ b/TestBO4E-dotnet-Encryption/TestBO4E-dotnet-Extensions-Encryption.csproj @@ -11,7 +11,10 @@ - + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + diff --git a/TestBO4E-dotnet-Encryption/TestEncrypter.cs b/TestBO4E-dotnet-Encryption/TestEncrypter.cs index fe562b5a..5201e9cc 100644 --- a/TestBO4E-dotnet-Encryption/TestEncrypter.cs +++ b/TestBO4E-dotnet-Encryption/TestEncrypter.cs @@ -2,13 +2,18 @@ using System.Collections.Generic; using System.IO; using System.Security.Cryptography.X509Certificates; + using BO4E.BO; using BO4E.Extensions.Encryption; + using Microsoft.VisualStudio.TestTools.UnitTesting; + using Newtonsoft.Json; using Newtonsoft.Json.Linq; + using Org.BouncyCastle.Crypto; using Org.BouncyCastle.OpenSsl; + using Sodium; namespace TestBO4EExtensions.Encryption @@ -45,7 +50,7 @@ public void TestDisposal() { exceptionThrown = true; } - def = new SymmetricEncrypter(symkey); + _ = new SymmetricEncrypter(symkey); Assert.IsFalse(exceptionThrown); } @@ -88,8 +93,8 @@ public void TestBOEncryption() } string expectedString = JsonConvert.SerializeObject(bo); string actualString = JsonConvert.SerializeObject(boDecrypted); - Assert.IsTrue(expectedString == actualString, "Original and encrypted->decrypted object do not match!"); - + Assert.AreEqual(expectedString, actualString, "Original and encrypted->decrypted object do not match!"); + /******* asymmetric test ******/ var asykeyPairSender = PublicKeyBox.GenerateKeyPair(); var asykeyPairRecipient = PublicKeyBox.GenerateKeyPair(); @@ -104,7 +109,7 @@ public void TestBOEncryption() } expectedString = JsonConvert.SerializeObject(bo); actualString = JsonConvert.SerializeObject(boDecrypted); - Assert.IsTrue(expectedString == actualString, "Original and encrypted->decrypted object do not match!"); + Assert.AreEqual(expectedString, actualString, "Original and encrypted->decrypted object do not match!"); /******* X509 + RSA test ******/ // encrypt (without needing a private key) @@ -148,17 +153,15 @@ public void TestBOEncryption() using (X509AsymmetricEncrypter xasydecMultiple = new X509AsymmetricEncrypter(keyPair.Private)) { - using (X509AsymmetricEncrypter xasydecMultiple2 = new X509AsymmetricEncrypter(keyPair2.Private)) - { - boDecrypted = xasydecMultiple.Decrypt(eoMultiple); - BusinessObject boDecrypted2 = xasydecMultiple2.Decrypt(eoMultiple); - string actualString2 = JsonConvert.SerializeObject(boDecrypted2); - Assert.IsTrue(expectedString == actualString2, "Original and encrypted->decrypted object do not match!"); - } + using X509AsymmetricEncrypter xasydecMultiple2 = new X509AsymmetricEncrypter(keyPair2.Private); + boDecrypted = xasydecMultiple.Decrypt(eoMultiple); + BusinessObject boDecrypted2 = xasydecMultiple2.Decrypt(eoMultiple); + string actualString2 = JsonConvert.SerializeObject(boDecrypted2); + Assert.AreEqual(expectedString, actualString2, "Original and encrypted->decrypted object do not match!"); } expectedString = JsonConvert.SerializeObject(bo); actualString = JsonConvert.SerializeObject(boDecrypted); - Assert.IsTrue(expectedString == actualString, "Original and encrypted->decrypted object do not match!"); + Assert.AreEqual(expectedString, actualString, "Original and encrypted->decrypted object do not match!"); } } @@ -177,14 +180,14 @@ public void TestKeysFromBase64() [TestMethod] public void TestLogObjectDecryption() { - byte[] publicKey = Convert.FromBase64String("C1RpdN5DO86swpkegPxEMB60yVSXYLta6PfSnHuYpxA="); + //byte[] publicKey = Convert.FromBase64String("C1RpdN5DO86swpkegPxEMB60yVSXYLta6PfSnHuYpxA="); byte[] privateKey = Convert.FromBase64String("7BSU9FLrvo8hSk58fs/vHTN4fmRFYbwvI9ZRKmTDt/o="); try { EncryptedObject eo = JsonConvert.DeserializeObject("{\"versionStruktur\":1,\"boTyp\":\"ENCRYPTEDOBJECTPUBLICKEYBOX\",\"encryptionScheme\":1,\"nonce\":\"YRmjJpSb7irazqWbCwWvNWKlApIjGiRh\",\"cipherText\":\"H315B/1ualMyzg882cXXB2I8Ol19bQQ1RlzohUXIGvbY7xCtkVuZZXmTI3Ff1GLf7NoymoQKqW50k2jmBTsoSmFWhPwKxDlW9vdS71fzuJTXSgfEmXWEhez2cMuNo0CRP/jgWDDUDmu5R5jz0bB+/FxZECOfYR4WFuvTz4jM+G8=\",\"publicKey\":\"enRUmVbcBbnneJCnvaU+ldANIDc/wGfqTUVCtSkVwhU=\"}"); Encrypter dec = new AsymmetricEncrypter(privateKey); BusinessObject bo = dec.Decrypt(eo); - Assert.AreEqual(typeof(LogObject), bo.GetType()); + Assert.IsInstanceOfType(bo, typeof(BO4E.BO.LogObject)); } catch (JsonSerializationException) { diff --git a/TestBO4E-dotnet-Encryption/anonymizerTests/masterdata/delete_address_from_melo.json b/TestBO4E-dotnet-Encryption/anonymizerTests/masterdata/delete_address_from_melo.json index dd56ace4..7f6d7e0a 100644 --- a/TestBO4E-dotnet-Encryption/anonymizerTests/masterdata/delete_address_from_melo.json +++ b/TestBO4E-dotnet-Encryption/anonymizerTests/masterdata/delete_address_from_melo.json @@ -4,7 +4,7 @@ }, "input": { "boTyp": "MESSLOKATION", - "messLokationsId": "DEIMUDDERIHRMELOID12345", + "messlokationsId": "DEIMUDDERIHRMELOID12345", "sparte": "STROM", "messadresse": { "ort": "Leipzig", diff --git a/TestBO4E-dotnet-Encryption/anonymizerTests/masterdata/delete_pod_from_melo.json b/TestBO4E-dotnet-Encryption/anonymizerTests/masterdata/delete_pod_from_melo.json index 5f418cf2..ed1df2ca 100644 --- a/TestBO4E-dotnet-Encryption/anonymizerTests/masterdata/delete_pod_from_melo.json +++ b/TestBO4E-dotnet-Encryption/anonymizerTests/masterdata/delete_pod_from_melo.json @@ -4,7 +4,7 @@ }, "input": { "boTyp": "MESSLOKATION", - "messLokationsId": "DEIMUDDERIHRMELOID12345", + "messlokationsId": "DEIMUDDERIHRMELOID12345", "sparte": "STROM", "messadresse": { "ort": "Leipzig", @@ -15,6 +15,6 @@ }, "assertions": { "$['MESSLOKATION'][0]['messadresse']['strasse']": "Lindenauer Markt", - "$['MESSLOKATION'][0]['messLokationsId']": "|null|" + "$['MESSLOKATION'][0]['messlokationsId']": "|null|" } } \ No newline at end of file diff --git a/TestBO4E-dotnet-Encryption/anonymizerTests/masterdata/encrypt_pod.json b/TestBO4E-dotnet-Encryption/anonymizerTests/masterdata/encrypt_pod.json index 8bd57d36..84fccb63 100644 --- a/TestBO4E-dotnet-Encryption/anonymizerTests/masterdata/encrypt_pod.json +++ b/TestBO4E-dotnet-Encryption/anonymizerTests/masterdata/encrypt_pod.json @@ -5,7 +5,7 @@ "input": { "boTyp": "MESSLOKATION", "versionStruktur": 1, - "messLokationsId": "DEIMUDDERIHRMELOID12345", + "messlokationsId": "DEIMUDDERIHRMELOID12345", "sparte": 0, "netzebeneMessung": 0, "messadresse": { diff --git a/TestBO4E-dotnet-Encryption/anonymizerTests/masterdata/hash_address.json b/TestBO4E-dotnet-Encryption/anonymizerTests/masterdata/hash_address.json index 30edc6cb..19dad2c2 100644 --- a/TestBO4E-dotnet-Encryption/anonymizerTests/masterdata/hash_address.json +++ b/TestBO4E-dotnet-Encryption/anonymizerTests/masterdata/hash_address.json @@ -4,7 +4,7 @@ }, "input": { "boTyp": "MESSLOKATION", - "messLokationsId": "DEIMUDDERIHRMELOID12345", + "messlokationsId": "DEIMUDDERIHRMELOID12345", "sparte": "STROM", "messadresse": { "ort": "Leipzig", diff --git a/TestBO4E-dotnet-Encryption/anonymizerTests/masterdata/hash_pod.json b/TestBO4E-dotnet-Encryption/anonymizerTests/masterdata/hash_pod.json index d31e645c..ab4ef7c8 100644 --- a/TestBO4E-dotnet-Encryption/anonymizerTests/masterdata/hash_pod.json +++ b/TestBO4E-dotnet-Encryption/anonymizerTests/masterdata/hash_pod.json @@ -4,7 +4,7 @@ }, "input": { "boTyp": "MESSLOKATION", - "messLokationsId": "DEIMUDDERIHRMELOID12345", + "messlokationsId": "DEIMUDDERIHRMELOID12345", "sparte": "STROM", "messadresse": { "ort": "Leipzig", @@ -15,6 +15,6 @@ }, "assertions": { "$['MESSLOKATION'][0]['messadresse']['strasse']": "Lindenauer Markt", - "$['MESSLOKATION'][0]['messLokationsId']": "414bdcdf7e6adbe0eb18867371575021e284ad13d496b6f43aae4fe04b535e9f" + "$['MESSLOKATION'][0]['messlokationsId']": "414bdcdf7e6adbe0eb18867371575021e284ad13d496b6f43aae4fe04b535e9f" } } \ No newline at end of file diff --git a/TestBO4E-dotnet-Encryption/encrypterTests/bo/Messlokation.json b/TestBO4E-dotnet-Encryption/encrypterTests/bo/Messlokation.json index f50a62db..1a52f20a 100644 --- a/TestBO4E-dotnet-Encryption/encrypterTests/bo/Messlokation.json +++ b/TestBO4E-dotnet-Encryption/encrypterTests/bo/Messlokation.json @@ -1,6 +1,6 @@ { "versionStruktur": 1, "boTyp": "Messlokation", - "messLokationsId": "DE1234567889", + "messlokationsId": "DE1234567889", "sparte": "STROM" } \ No newline at end of file diff --git a/TestBO4E-dotnet-Extensions/ShowCaseTests/EnergiemengeShowCaseTests.cs b/TestBO4E-dotnet-Extensions/ShowCaseTests/EnergiemengeShowCaseTests.cs new file mode 100644 index 00000000..f1234502 --- /dev/null +++ b/TestBO4E-dotnet-Extensions/ShowCaseTests/EnergiemengeShowCaseTests.cs @@ -0,0 +1,61 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; + +using BO4E.BO; +using BO4E.COM; +using BO4E.ENUM; +using BO4E.Extensions.BusinessObjects.Energiemenge; + +using Itenso.TimePeriod; + +using Microsoft.VisualStudio.TestTools.UnitTesting; + +namespace TestBO4E.ShowCaseTests +{ + [TestClass] + public class EnergiemengeShowCaseTests + { + [TestMethod] + public void ShowCaseTest() + { + var em = new Energiemenge() + { + LokationsId = "DE0123456789012345678901234567890", + LokationsTyp = Lokationstyp.MeLo, + Energieverbrauch = new List() + { + new Verbrauch() + { + Einheit = Mengeneinheit.KWH, + Startdatum = new DateTime(2020,3,1,0,0,0,DateTimeKind.Utc), + Enddatum = new DateTime(2020,3,8,0,0,0,DateTimeKind.Utc), + Wert = 456.0M, + Wertermittlungsverfahren = Wertermittlungsverfahren.MESSUNG + }, + new Verbrauch() + { + Einheit = Mengeneinheit.KWH, + Startdatum = new DateTime(2020,3,25,0,0,0,DateTimeKind.Utc), + Enddatum = new DateTime(2020,4,1,0,0,0,DateTimeKind.Utc), + Wert = 123.0M, + Wertermittlungsverfahren = Wertermittlungsverfahren.MESSUNG + } + } + }; + Debug.WriteLine($"You got Verbrauch data for {Decimal.Round(em.GetCoverage() * 100.0M)}% of the time in between {em.Energieverbrauch.Select(v => v.Startdatum).Min().ToString("yyyy-MM-dd")} and {em.Energieverbrauch.Select(v => v.Enddatum).Max().ToString("yyyy-MM-dd")}"); + // You got Verbrauch data for 45% of the time in between 2020-03-01 and 2020-04-01 + + var consumption = em.GetTotalConsumption(); + Debug.WriteLine($"The total consumption is {consumption.Item1}{consumption.Item2}"); + // The total consumption is 579,0KWH + + var consumptionMarch7 = em.GetConsumption(new TimeRange(start: new DateTime(2020, 3, 7, 0, 0, 0, DateTimeKind.Utc), end: new DateTime(2020, 3, 8, 0, 0, 0, DateTimeKind.Utc))); + Debug.WriteLine($"The total consumption on March 7 is {Decimal.Round(consumptionMarch7.Item1)}{consumptionMarch7.Item2}"); + // The total consumption on March 7 is 65KWH + + // ToDo: show other methods. + } + } +} \ No newline at end of file diff --git a/TestBO4E-dotnet-Extensions/ShowCaseTests/VerbrauchShowCaseTests.cs b/TestBO4E-dotnet-Extensions/ShowCaseTests/VerbrauchShowCaseTests.cs new file mode 100644 index 00000000..69b79869 --- /dev/null +++ b/TestBO4E-dotnet-Extensions/ShowCaseTests/VerbrauchShowCaseTests.cs @@ -0,0 +1,59 @@ +using System; +using System.Diagnostics; + +using BO4E.COM; +using BO4E.ENUM; +using BO4E.Extensions.COM; + +using Microsoft.VisualStudio.TestTools.UnitTesting; + +namespace TestBO4E.ShowCaseTests +{ + [TestClass] + public class VerbrauchShowCaseTests + { + [TestMethod] + public void ShowCaseTest() + { + var verbrauchA = new Verbrauch() + { + Startdatum = new DateTime(2020, 3, 1, 0, 0, 0, DateTimeKind.Utc), + Enddatum = new DateTime(2020, 3, 8, 0, 0, 0, DateTimeKind.Utc), + Wert = 0.456M, + Einheit = Mengeneinheit.MW, + Wertermittlungsverfahren = Wertermittlungsverfahren.MESSUNG + }; + + verbrauchA.ConvertToUnit(Mengeneinheit.KW); + Debug.WriteLine($"{nameof(verbrauchA)} contains {verbrauchA.Wert}{verbrauchA.Einheit}"); + // v contains 456,000KW + + try + { + verbrauchA.ConvertToUnit(Mengeneinheit.TAG); + } + catch (InvalidOperationException ioe) + { + Debug.WriteLine(ioe.Message); + // KW and TAG are not convertible into each other because they don't share the same dimension. + } + + var verbrauchB = new Verbrauch() + { + Startdatum = new DateTime(2020, 3, 7, 0, 0, 0, DateTimeKind.Utc), + Enddatum = new DateTime(2020, 3, 14, 0, 0, 0, DateTimeKind.Utc), + Wert = 0.1M, + Einheit = Mengeneinheit.KW, + Wertermittlungsverfahren = Wertermittlungsverfahren.MESSUNG + }; + + foreach (Verbrauch v in verbrauchA.Merge(verbrauchB)) + { + Debug.WriteLine($"{v.Startdatum.ToString("yyyy-MM-dd")} to {v.Enddatum.ToString("yyyy-MM-dd")}: {v.Wert}{v.Einheit}"); + } + // 2020-03-01 to 2020-03-07: 456,000KW + // 2020-03-07 to 2020-03-08: 456,100KW + // 2020-03-08 to 2020-03-14: 0,1KW + } + } +} \ No newline at end of file diff --git a/TestBO4E-dotnet-Extensions/TestBO4E-dotnet-Extensions.csproj b/TestBO4E-dotnet-Extensions/TestBO4E-dotnet-Extensions.csproj index 4c06bcf6..4ab41f77 100644 --- a/TestBO4E-dotnet-Extensions/TestBO4E-dotnet-Extensions.csproj +++ b/TestBO4E-dotnet-Extensions/TestBO4E-dotnet-Extensions.csproj @@ -15,7 +15,10 @@ - + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + diff --git a/TestBO4E-dotnet-Extensions/TestBenachrichtigungExtension.cs b/TestBO4E-dotnet-Extensions/TestBenachrichtigungExtension.cs index a83d4029..430f0ad6 100644 --- a/TestBO4E-dotnet-Extensions/TestBenachrichtigungExtension.cs +++ b/TestBO4E-dotnet-Extensions/TestBenachrichtigungExtension.cs @@ -1,9 +1,12 @@ using System; using System.Collections.Generic; + using BO4E.BO; using BO4E.COM; using BO4E.Extensions.BusinessObjects.Benachrichtigung; + using Microsoft.VisualStudio.TestTools.UnitTesting; + using Newtonsoft.Json; using Newtonsoft.Json.Linq; @@ -17,12 +20,12 @@ public void TestHas() { Benachrichtigung b = new Benachrichtigung() { - benachrichtigungsId = "1234", - bearbeiter = "dei mudder", - infos = new List() + BenachrichtigungsId = "1234", + Bearbeiter = "dei mudder", + Infos = new List() { - new GenericStringStringInfo() { keyColumn = "ads", value = "xyz" }, - new GenericStringStringInfo() { keyColumn = "null", value = null }, + new GenericStringStringInfo() { KeyColumn = "ads", Value = "xyz" }, + new GenericStringStringInfo() { KeyColumn = "null", Value = null }, } }; @@ -43,11 +46,11 @@ public void TestMoveInfo2UP() { Benachrichtigung b = JsonConvert.DeserializeObject("{\"versionStruktur\":1,\"boTyp\":\"BENACHRICHTIGUNG\",\"benachrichtigungsId\":\"468985\",\"prioritaet\":2,\"bearbeitungsstatus\":0,\"kurztext\":\"Manuelles Überschreiben von Profilwerten\",\"erstellungsZeitpunkt\":\"2019-04-01T14:27:23Z\",\"kategorie\":\"ZE01\",\"bearbeiter\":\"\",\"notizen\":null,\"deadline\":null,\"aufgaben\":null,\"infos\":null,\"aufgaben\":[{\"ccat\":\"ZE01\",\"objtype\":\"ZISUPROFIL\",\"aufgabenId\":\"OVERWRITE\",\"ausgefuehrt\":\"true\"},{\"ccat\":\"ZE01\",\"objtype\":\"ZISUPROFIL\",\"aufgabenId\":\"DISPLAY\",\"ausgefuehrt\":\"true\"}],\"infos\":[{\"keyColumn\":\"MESSLOKATIONSID\",\"value\":\"DE000360478090000000\",\"boolean_true_column\":false},{\"keyColumn\":\"TIMESPAN_FROM\",\"value\":\"2019-02-25T23:00:00Z\",\"boolean_true_column\":false},{\"keyColumn\":\"TIMESPAN_TO\",\"value\":\"2019-03-19T22:44:59Z\",\"boolean_true_column\":false}],\"notizen\":[]}"); Assert.IsTrue(b.Has("MESSLOKATIONSID")); - Assert.IsTrue(b.userProperties == null || b.userProperties.Count == 0); + Assert.IsTrue(b.UserProperties == null || b.UserProperties.Count == 0); b.MoveInfosToUserProperties(); - Assert.IsNotNull(b.userProperties); - Assert.IsTrue(b.userProperties.ContainsKey("MESSLOKATIONSID")); - Assert.IsNull(b.infos); + Assert.IsNotNull(b.UserProperties); + Assert.IsTrue(b.UserProperties.ContainsKey("MESSLOKATIONSID")); + Assert.IsNull(b.Infos); } [TestMethod] @@ -62,10 +65,10 @@ public void TestHasWithMesslokationsId() public void TestDateTimePredicates() { Benachrichtigung b = JsonConvert.DeserializeObject("{\"versionStruktur\":1,\"boTyp\":\"BENACHRICHTIGUNG\",\"benachrichtigungsId\":\"469568\",\"prioritaet\":2,\"bearbeitungsstatus\":1,\"kurztext\":\"Manuelles \u00dcberschreiben von Profilwerten\",\"erstellungsZeitpunkt\":\"2019-04-02T13:35:03Z\",\"kategorie\":\"ZE01\",\"bearbeiter\":\"SCHLEBDA\",\"notizen\":[],\"deadline\":null,\"aufgaben\":[{\"aufgabenId\":\"OVERWRITE\",\"beschreibung\":null,\"deadline\":null,\"ausgefuehrt\":true,\"ausfuehrungsdatum\":null,\"ausfuehrender\":null,\"ccat\":\"ZE01\",\"objtype\":\"ZISUPROFIL\"},{\"aufgabenId\":\"DISPLAY\",\"beschreibung\":null,\"deadline\":null,\"ausgefuehrt\":true,\"ausfuehrungsdatum\":null,\"ausfuehrender\":null,\"ccat\":\"ZE01\",\"objtype\":\"ZISUPROFIL\"}],\"infos\":null,\"MESS\":\"9977768000005\",\"MESSLOKATIONSID\":\"DE0003604763800000000000010376811\",\"TIMESPAN_FROM\":\"2019-03-11T23:30:00Z\",\"TIMESPAN_TO\":\"2019-03-12T22:59:59Z\"}"); - Assert.IsTrue(b.userProperties.TryGetValue("TIMESPAN_FROM", out JToken jtLower)); - var lower = jtLower.Value(); - Assert.IsTrue(b.userProperties.TryGetValue("TIMESPAN_TO", out JToken jtUpper)); - var upper = jtUpper.Value(); + Assert.IsTrue(b.UserProperties.TryGetValue("TIMESPAN_FROM", out JToken jtLower)); + _ = jtLower.Value(); + Assert.IsTrue(b.UserProperties.TryGetValue("TIMESPAN_TO", out JToken jtUpper)); + _ = jtUpper.Value(); } } } \ No newline at end of file diff --git a/TestBO4E-dotnet-Extensions/TestCloningExtension.cs b/TestBO4E-dotnet-Extensions/TestCloningExtension.cs index 85439106..c0cd4c6d 100644 --- a/TestBO4E-dotnet-Extensions/TestCloningExtension.cs +++ b/TestBO4E-dotnet-Extensions/TestCloningExtension.cs @@ -16,7 +16,7 @@ public void TestCloning() { Messlokation bo = new Messlokation() { - messlokationsId = "DE345", + MesslokationsId = "DE345", }; Messlokation cloneBo = BusinessObjectExtensions.DeepClone((Messlokation)bo); @@ -30,38 +30,38 @@ public void TestCloningEnergiemenge() { Energiemenge em = new Energiemenge() { - lokationsId = "De12345", - lokationstyp = BO4E.ENUM.Lokationstyp.MaLo, - energieverbrauch = new List() + LokationsId = "De12345", + LokationsTyp = BO4E.ENUM.Lokationstyp.MaLo, + Energieverbrauch = new List() { new BO4E.COM.Verbrauch() { - einheit = BO4E.ENUM.Mengeneinheit.KWH, - wert = 123.456M, - obiskennzahl = "dei vadder", - wertermittlungsverfahren = BO4E.ENUM.Wertermittlungsverfahren.MESSUNG, - startdatum = new System.DateTime(2018,12,31,23,0,0,0, System.DateTimeKind.Utc), - enddatum = new System.DateTime(2019,12,31,23,0,0,0,System.DateTimeKind.Utc) + Einheit = BO4E.ENUM.Mengeneinheit.KWH, + Wert = 123.456M, + Obiskennzahl = "dei vadder", + Wertermittlungsverfahren = BO4E.ENUM.Wertermittlungsverfahren.MESSUNG, + Startdatum = new System.DateTime(2018,12,31,23,0,0,0, System.DateTimeKind.Utc), + Enddatum = new System.DateTime(2019,12,31,23,0,0,0,System.DateTimeKind.Utc) }, new BO4E.COM.Verbrauch() { - einheit = BO4E.ENUM.Mengeneinheit.KWH, - wert = 789.123M, - obiskennzahl = "dei mudder", - wertermittlungsverfahren = BO4E.ENUM.Wertermittlungsverfahren.MESSUNG, - startdatum = new System.DateTime(2019,12,31,23,0,0,0, System.DateTimeKind.Utc), - enddatum = new System.DateTime(2020,12,31,23,0,0,0,System.DateTimeKind.Utc) + Einheit = BO4E.ENUM.Mengeneinheit.KWH, + Wert = 789.123M, + Obiskennzahl = "dei mudder", + Wertermittlungsverfahren = BO4E.ENUM.Wertermittlungsverfahren.MESSUNG, + Startdatum = new System.DateTime(2019,12,31,23,0,0,0, System.DateTimeKind.Utc), + Enddatum = new System.DateTime(2020,12,31,23,0,0,0,System.DateTimeKind.Utc) } } }; var cloned = em.DeepClone(); - Assert.AreEqual(em.energieverbrauch.Count, cloned.energieverbrauch.Count); + Assert.AreEqual(em.Energieverbrauch.Count, cloned.Energieverbrauch.Count); var cloned2 = em.DeepClone(); - Assert.AreEqual(em.energieverbrauch.Count, cloned2.energieverbrauch.Count); + Assert.AreEqual(em.Energieverbrauch.Count, cloned2.Energieverbrauch.Count); var cloned3 = (em as BusinessObject).DeepClone(); - Assert.AreEqual(em.energieverbrauch.Count, (cloned3 as Energiemenge).energieverbrauch.Count); + Assert.AreEqual(em.Energieverbrauch.Count, (cloned3 as Energiemenge).Energieverbrauch.Count); } } } \ No newline at end of file diff --git a/TestBO4E-dotnet-Extensions/TestEnergiemengeExtension.cs b/TestBO4E-dotnet-Extensions/TestEnergiemengeExtension.cs index 5d003e1d..c043c29a 100644 --- a/TestBO4E-dotnet-Extensions/TestEnergiemengeExtension.cs +++ b/TestBO4E-dotnet-Extensions/TestEnergiemengeExtension.cs @@ -2,13 +2,18 @@ using System.Globalization; using System.IO; using System.Linq; + using BO4E; using BO4E.BO; using BO4E.ENUM; using BO4E.Extensions.BusinessObjects; using BO4E.Extensions.BusinessObjects.Energiemenge; +using BO4E.meta.LenientConverters; + using Itenso.TimePeriod; + using Microsoft.VisualStudio.TestTools.UnitTesting; + using Newtonsoft.Json; using Newtonsoft.Json.Linq; @@ -29,11 +34,9 @@ public void TestTestingRanges() Assert.AreEqual(47, march2425.Duration.TotalHours); } - [TestMethod] public void TestEnergiemengeObjects() { - bool intensiveExceptionThrown = false; foreach (string boFile in Directory.GetFiles("Energiemenge/", "*.json")) { JObject json; @@ -145,13 +148,13 @@ public void TestEnergiemengeObjects() { var pureEms = em.SplitInPureGroups(); var emptyEm = em.DeepClone(); - emptyEm.energieverbrauch = null; - Assert.AreEqual(em.energieverbrauch.Count, pureEms.Select(x => x.energieverbrauch.Count).Sum()); + emptyEm.Energieverbrauch = null; + Assert.AreEqual(em.Energieverbrauch.Count, pureEms.Select(x => x.Energieverbrauch.Count).Sum()); foreach (var pureEm in pureEms) { Assert.IsTrue(pureEm.IsPure()); var emptyPureEm = pureEm.DeepClone(); - emptyPureEm.energieverbrauch = null; + emptyPureEm.Energieverbrauch = null; Assert.AreEqual(emptyEm, emptyPureEm); } } @@ -174,17 +177,9 @@ public void TestEnergiemengeObjects() Assert.AreEqual(Math.Round(targetValue, 12), Math.Round(emNormalised.GetTotalConsumption().Item1, 12)); } - if (em.IsIntensive() && !intensiveExceptionThrown) // test this once for one object. that's enough + if (em.IsIntensive()) // test this once for one object. that's enough { - try - { - em.GetTotalConsumption(); - } - catch (ArgumentException) - { - intensiveExceptionThrown = true; - } - Assert.IsTrue(intensiveExceptionThrown, "It must not be allowed to add up intensive units."); + Assert.ThrowsException(() => em.GetTotalConsumption(), "It must not be allowed to add up intensive units."); } } } @@ -194,7 +189,7 @@ public void TestDetangling() { Energiemenge em = JsonConvert.DeserializeObject("{\"versionStruktur\":1,\"boTyp\":\"ENERGIEMENGE\",\"lokationsId\":\"DE0003604780400000000000012345678\",\"lokationstyp\":\"MeLo\",\"energieverbrauch\":[{\"startdatum\":\"2019-03-01T00:00:00Z\",\"enddatum\":\"2019-06-24T00:00:00Z\",\"wertermittlungsverfahren\":\"MESSUNG\",\"obiskennzahl\":\"1-0:1.8.0\",\"wert\":1,\"einheit\":\"KWH\",\"zaehlernummer\":\"10654212\"},{\"startdatum\":\"2019-03-01T00:00:00Z\",\"enddatum\":\"2019-06-24T00:00:00Z\",\"wertermittlungsverfahren\":\"MESSUNG\",\"obiskennzahl\":\"1-0:2.8.0\",\"wert\":1,\"einheit\":\"KWH\",\"zaehlernummer\":\"10654212\"}],\"anlagennummer\":\"50693510\",\"messlokationsId\":\"DE0003604780400000000000012345678\",\"marktlokationsId\":\"\",\"isMelo\":true,\"zaehlernummer\":\"10654212\"}"); em.Detangle(); - Assert.AreEqual(2, em.energieverbrauch.Count); + Assert.AreEqual(2, em.Energieverbrauch.Count); // todo: add real test. this one is limited. } diff --git a/TestBO4E-dotnet-Extensions/TestEnergiemengeExtensionCompleteness.cs b/TestBO4E-dotnet-Extensions/TestEnergiemengeExtensionCompleteness.cs index fd29bf69..3ae89963 100644 --- a/TestBO4E-dotnet-Extensions/TestEnergiemengeExtensionCompleteness.cs +++ b/TestBO4E-dotnet-Extensions/TestEnergiemengeExtensionCompleteness.cs @@ -7,6 +7,7 @@ using BO4E.COM; using BO4E.ENUM; using BO4E.Extensions.BusinessObjects.Energiemenge; +using BO4E.meta.LenientConverters; using BO4E.Reporting; using Itenso.TimePeriod; using Microsoft.VisualStudio.TestTools.UnitTesting; @@ -39,19 +40,19 @@ public void TestCompletenessReportGenerationSomeCustomer() if (boFile.EndsWith("somecustomer1.json")) { cr = em.GetCompletenessReport(); - Assert.AreEqual((decimal)0.9601, Math.Round(cr.coverage.Value, 4)); - Assert.AreEqual("4-5-6-7", cr.obiskennzahl); + Assert.AreEqual((decimal)0.9601, Math.Round(cr.Coverage.Value, 4)); + Assert.AreEqual("4-5-6-7", cr.Obiskennzahl); Assert.AreEqual(Wertermittlungsverfahren.MESSUNG, cr.wertermittlungsverfahren); - Assert.AreEqual(Mengeneinheit.KWH, cr.einheit); - Assert.AreEqual("DEXXX", cr.lokationsId); + Assert.AreEqual(Mengeneinheit.KWH, cr.Einheit); + Assert.AreEqual("DEXXX", cr.LokationsId); //Assert.AreEqual(15, cr.values[0].wert); //Assert.AreEqual(TestEnergiemengeExtension.GERMAN_APRIL_2018.Start, cr.values[0].startdatum); string resultString = JsonConvert.SerializeObject(cr, new StringEnumConverter()); - Assert.IsNotNull(cr.gaps); - Assert.AreEqual(1, cr.gaps.Count); - Assert.AreEqual(new DateTime(2018, 4, 1, 1, 45, 0, DateTimeKind.Utc), cr.gaps.First().startdatum); - Assert.AreEqual(new DateTime(2018, 4, 2, 6, 30, 0, DateTimeKind.Utc), cr.gaps.First().enddatum); + Assert.IsNotNull(cr.Gaps); + Assert.AreEqual(1, cr.Gaps.Count); + Assert.AreEqual(new DateTime(2018, 4, 1, 1, 45, 0, DateTimeKind.Utc), cr.Gaps.First().Startdatum); + Assert.AreEqual(new DateTime(2018, 4, 2, 6, 30, 0, DateTimeKind.Utc), cr.Gaps.First().Enddatum); } else if (boFile.EndsWith("somecustomer2.json")) { @@ -61,13 +62,13 @@ public void TestCompletenessReportGenerationSomeCustomer() string resultString = JsonConvert.SerializeObject(cr, new StringEnumConverter()); CompletenessReport cr2 = em.GetCompletenessReport(new CompletenessReport.CompletenessReportConfiguration { - einheit = combi.Item3, - obis = combi.Item2, - wertermittlungsverfahren = combi.Item1, - referenceTimeFrame = new BO4E.COM.Zeitraum + Einheit = combi.Item3, + Obis = combi.Item2, + Wertermittlungsverfahren = combi.Item1, + ReferenceTimeFrame = new BO4E.COM.Zeitraum { - startdatum = TestEnergiemengeExtension.GERMAN_APRIL_2018.Start, - enddatum = TestEnergiemengeExtension.GERMAN_APRIL_2018.End + Startdatum = TestEnergiemengeExtension.GERMAN_APRIL_2018.Start, + Enddatum = TestEnergiemengeExtension.GERMAN_APRIL_2018.End } }); //Assert.AreEqual(cr, cr2, "calling report with configuration instead of loose parameters doesn't work."); @@ -104,9 +105,9 @@ public void TestCompletenessReportGenerationSmard() crlist.Add(cr); if (boFile.Contains("onshore.json")) { - Assert.IsNotNull(cr.userProperties); - Assert.AreEqual("yippi yippi yeah", cr.userProperties["meineUp0"].Value()); - Assert.AreEqual("krawall und remmidemmi", cr.userProperties["meineUp1"].Value()); + Assert.IsNotNull(cr.UserProperties); + Assert.AreEqual("yippi yippi yeah", cr.UserProperties["meineUp0"].Value()); + Assert.AreEqual("krawall und remmidemmi", cr.UserProperties["meineUp1"].Value()); } } } @@ -131,8 +132,8 @@ public void TestRounding() Start = new DateTime(2017, 12, 31, 23, 0, 0, 0, DateTimeKind.Utc), End = new DateTime(2018, 1, 31, 23, 0, 0, 0, DateTimeKind.Utc) }); - Assert.AreEqual(1.0M, cr.coverage.Value); - Assert.AreEqual(0, cr.gaps.Count()); + Assert.AreEqual(1.0M, cr.Coverage.Value); + Assert.AreEqual(0, cr.Gaps.Count()); var dailies = em.GetDailyCompletenessReports(new TimeRange() { @@ -141,9 +142,9 @@ public void TestRounding() }); foreach (var crDaily in dailies) { - Assert.AreEqual(1.0M, crDaily.Value.coverage.Value, $"error in slice {crDaily.Key}"); + Assert.AreEqual(1.0M, crDaily.Value.Coverage.Value, $"error in slice {crDaily.Key}"); } - Assert.AreEqual(1.0M, cr.coverage.Value); + Assert.AreEqual(1.0M, cr.Coverage.Value); } [TestMethod] @@ -151,35 +152,35 @@ public void TestFirstLastGap() { Energiemenge em = new Energiemenge() { - lokationsId = "DE123455", - lokationstyp = Lokationstyp.MeLo, - energieverbrauch = new List() + LokationsId = "DE123455", + LokationsTyp = Lokationstyp.MeLo, + Energieverbrauch = new List() { new Verbrauch() { - obiskennzahl="1234", - wert=123.456M, - wertermittlungsverfahren=Wertermittlungsverfahren.MESSUNG, - startdatum = new DateTime(2019,1,1,0,0,0,DateTimeKind.Utc), - enddatum = new DateTime(2019,1,4,0,0,0,DateTimeKind.Utc), + Obiskennzahl="1234", + Wert=123.456M, + Wertermittlungsverfahren=Wertermittlungsverfahren.MESSUNG, + Startdatum = new DateTime(2019,1,1,0,0,0,DateTimeKind.Utc), + Enddatum = new DateTime(2019,1,4,0,0,0,DateTimeKind.Utc), }, new Verbrauch() { - obiskennzahl="1234", - wert=123.456M, - wertermittlungsverfahren=Wertermittlungsverfahren.MESSUNG, - startdatum = new DateTime(2019,1,4,0,0,0,DateTimeKind.Utc), - enddatum = new DateTime(2019,1,7,0,0,0,DateTimeKind.Utc), + Obiskennzahl="1234", + Wert=123.456M, + Wertermittlungsverfahren=Wertermittlungsverfahren.MESSUNG, + Startdatum = new DateTime(2019,1,4,0,0,0,DateTimeKind.Utc), + Enddatum = new DateTime(2019,1,7,0,0,0,DateTimeKind.Utc), } } }; var cr = em.GetCompletenessReport(new TimeRange(new DateTime(2018, 12, 29, 0, 0, 0, DateTimeKind.Utc), new DateTime(2019, 1, 10, 0, 0, 0, DateTimeKind.Utc))); - Assert.AreEqual(2, cr.gaps.Count()); - Assert.AreEqual(new DateTime(2018, 12, 29, 0, 0, 0, DateTimeKind.Utc), cr.gaps.First().startdatum); - Assert.AreEqual(new DateTime(2019, 1, 1, 0, 0, 0, DateTimeKind.Utc), cr.gaps.First().enddatum); - Assert.AreEqual(new DateTime(2019, 1, 7, 0, 0, 0, DateTimeKind.Utc), cr.gaps.Last().startdatum); - Assert.AreEqual(new DateTime(2019, 1, 10, 0, 0, 0, DateTimeKind.Utc), cr.gaps.Last().enddatum); + Assert.AreEqual(2, cr.Gaps.Count()); + Assert.AreEqual(new DateTime(2018, 12, 29, 0, 0, 0, DateTimeKind.Utc), cr.Gaps.First().Startdatum); + Assert.AreEqual(new DateTime(2019, 1, 1, 0, 0, 0, DateTimeKind.Utc), cr.Gaps.First().Enddatum); + Assert.AreEqual(new DateTime(2019, 1, 7, 0, 0, 0, DateTimeKind.Utc), cr.Gaps.Last().Startdatum); + Assert.AreEqual(new DateTime(2019, 1, 10, 0, 0, 0, DateTimeKind.Utc), cr.Gaps.Last().Enddatum); } [TestMethod] @@ -187,31 +188,31 @@ public void TestNullableCoverage() { Energiemenge em1 = new Energiemenge() { - lokationsId = "DE123456789DieseEmhatkeineVerbräuche", - lokationstyp = Lokationstyp.MeLo, - energieverbrauch = new List() //empty list + LokationsId = "DE123456789DieseEmhatkeineVerbräuche", + LokationsTyp = Lokationstyp.MeLo, + Energieverbrauch = new List() //empty list }; CompletenessReport cr1 = em1.GetCompletenessReport(); Assert.IsNotNull(cr1); - Assert.IsNull(cr1.coverage); + Assert.IsNull(cr1.Coverage); JsonConvert.SerializeObject(cr1); // must _not_ throw exception Energiemenge em2 = new Energiemenge() { - lokationsId = "54321012345DieseEmhatkeineVerbräuche", - lokationstyp = Lokationstyp.MeLo, - energieverbrauch = new List() //empty list + LokationsId = "54321012345DieseEmhatkeineVerbräuche", + LokationsTyp = Lokationstyp.MeLo, + Energieverbrauch = new List() //empty list }; CompletenessReport cr2 = em2.GetCompletenessReport(CHRISTMAS_2018, Wertermittlungsverfahren.MESSUNG, "1-2-3-4", Mengeneinheit.KUBIKMETER); Assert.IsNotNull(cr2); - Assert.IsNotNull(cr2.coverage); // not null because no values but configuration given - Assert.AreEqual(0.0M, cr2.coverage); + Assert.IsNotNull(cr2.Coverage); // not null because no values but configuration given + Assert.AreEqual(0.0M, cr2.Coverage); JsonConvert.SerializeObject(cr2); // must _not_ throw exception CompletenessReport cr3 = em2.GetCompletenessReport(CHRISTMAS_2018); Assert.IsNotNull(cr3); - Assert.IsNotNull(cr3.coverage); - Assert.AreEqual(0.0M, cr3.coverage); + Assert.IsNotNull(cr3.Coverage); + Assert.AreEqual(0.0M, cr3.Coverage); JsonConvert.SerializeObject(cr3); // must _not_ throw exception } @@ -283,7 +284,7 @@ public void TestParallization() MiniProfiler mpFixSapCds = MiniProfiler.StartNew("Fix SAP CDS"); em.FixSapCDSBug(); mpFixSapCds.Stop(); - Assert.IsTrue(mpFixSapCds.DurationMilliseconds < 50, mpFixSapCds.RenderPlainText()); + Assert.IsTrue(mpFixSapCds.DurationMilliseconds < 500, mpFixSapCds.RenderPlainText()); Console.Out.WriteLine(mpFixSapCds.RenderPlainText()); MiniProfiler mpFixSapCds2 = MiniProfiler.StartNew("Fix SAP CDS"); @@ -325,10 +326,10 @@ public void TestDailyParallization() dateTime = dateTime.AddMinutes(15); DateTime endDateTime = dateTime.AddMinutes(15); - listvb.Add(new Verbrauch() { startdatum = dateTime, enddatum = endDateTime, einheit = Mengeneinheit.JAHR, wert = 12 }); + listvb.Add(new Verbrauch() { Startdatum = dateTime, Enddatum = endDateTime, Einheit = Mengeneinheit.JAHR, Wert = 12 }); dateTime = endDateTime; } - em.energieverbrauch = listvb; + em.Energieverbrauch = listvb; MiniProfiler mpLinear = MiniProfiler.StartNew("Non-Parallel"); em.GetMonthlyCompletenessReports(new TimeRange(new DateTime(2015, 1, 1, 23, 00, 0, DateTimeKind.Utc), new DateTime(2019, 12, 31, 23, 0, 0, DateTimeKind.Utc)), useParallelExecution: false); @@ -387,24 +388,24 @@ public void TestDailyCompletenessDST() Assert.AreEqual(2 * 24 - 1, verbrauchSlices.Count); Energiemenge em = new Energiemenge() { - lokationsId = "MeinUnitTest123", - lokationstyp = Lokationstyp.MeLo, - energieverbrauch = verbrauchSlices.Select(vs => new BO4E.COM.Verbrauch() + LokationsId = "MeinUnitTest123", + LokationsTyp = Lokationstyp.MeLo, + Energieverbrauch = verbrauchSlices.Select(vs => new BO4E.COM.Verbrauch() { - startdatum = vs.Start, - enddatum = vs.End, - einheit = Mengeneinheit.KWH, - wert = (decimal)123.456, - wertermittlungsverfahren = Wertermittlungsverfahren.MESSUNG + Startdatum = vs.Start, + Enddatum = vs.End, + Einheit = Mengeneinheit.KWH, + Wert = (decimal)123.456, + Wertermittlungsverfahren = Wertermittlungsverfahren.MESSUNG } ).ToList() }; var result = em.GetDailyCompletenessReports(new TimeRange(utcStart, utcEnd)); Assert.AreEqual(2, result.Count); - Assert.AreEqual(new DateTime(2018, 3, 24, 23, 0, 0, DateTimeKind.Utc), result.First().Value.referenceTimeFrame.startdatum); - Assert.AreEqual(new DateTime(2018, 3, 25, 22, 0, 0, DateTimeKind.Utc), result.First().Value.referenceTimeFrame.enddatum); - Assert.AreEqual(new DateTime(2018, 3, 25, 22, 0, 0, DateTimeKind.Utc), result.Last().Value.referenceTimeFrame.startdatum); - Assert.AreEqual(new DateTime(2018, 3, 26, 22, 0, 0, DateTimeKind.Utc), result.Last().Value.referenceTimeFrame.enddatum); + Assert.AreEqual(new DateTime(2018, 3, 24, 23, 0, 0, DateTimeKind.Utc), result.First().Value.ReferenceTimeFrame.Startdatum); + Assert.AreEqual(new DateTime(2018, 3, 25, 22, 0, 0, DateTimeKind.Utc), result.First().Value.ReferenceTimeFrame.Enddatum); + Assert.AreEqual(new DateTime(2018, 3, 25, 22, 0, 0, DateTimeKind.Utc), result.Last().Value.ReferenceTimeFrame.Startdatum); + Assert.AreEqual(new DateTime(2018, 3, 26, 22, 0, 0, DateTimeKind.Utc), result.Last().Value.ReferenceTimeFrame.Enddatum); } [TestMethod] diff --git a/TestBO4E-dotnet-Extensions/TestVerbrauchExtension.cs b/TestBO4E-dotnet-Extensions/TestVerbrauchExtension.cs index 3e0f5d87..f9fbe364 100644 --- a/TestBO4E-dotnet-Extensions/TestVerbrauchExtension.cs +++ b/TestBO4E-dotnet-Extensions/TestVerbrauchExtension.cs @@ -19,21 +19,21 @@ public void TestMergeNoOverlap() { Verbrauch v1 = new Verbrauch() { - obiskennzahl = "123", - wertermittlungsverfahren = Wertermittlungsverfahren.MESSUNG, - einheit = Mengeneinheit.KWH, - wert = 5, - startdatum = new DateTime(2017, 12, 31, 23, 0, 0, DateTimeKind.Utc), - enddatum = new DateTime(2018, 1, 31, 23, 0, 0, DateTimeKind.Utc) + Obiskennzahl = "123", + Wertermittlungsverfahren = Wertermittlungsverfahren.MESSUNG, + Einheit = Mengeneinheit.KWH, + Wert = 5, + Startdatum = new DateTime(2017, 12, 31, 23, 0, 0, DateTimeKind.Utc), + Enddatum = new DateTime(2018, 1, 31, 23, 0, 0, DateTimeKind.Utc) }; Verbrauch v2 = new Verbrauch() { - obiskennzahl = "123", - wertermittlungsverfahren = Wertermittlungsverfahren.MESSUNG, - einheit = Mengeneinheit.KWH, - wert = 3, - startdatum = new DateTime(2018, 2, 28, 23, 0, 0, DateTimeKind.Utc), - enddatum = new DateTime(2018, 3, 31, 23, 0, 0, DateTimeKind.Utc) + Obiskennzahl = "123", + Wertermittlungsverfahren = Wertermittlungsverfahren.MESSUNG, + Einheit = Mengeneinheit.KWH, + Wert = 3, + Startdatum = new DateTime(2018, 2, 28, 23, 0, 0, DateTimeKind.Utc), + Enddatum = new DateTime(2018, 3, 31, 23, 0, 0, DateTimeKind.Utc) }; HashSet result = v1.Merge(v2); Assert.AreEqual(2, result.Count); @@ -46,27 +46,27 @@ public void TestMergeAdjacentExtensive() { Verbrauch v1 = new Verbrauch() { - obiskennzahl = "123", - wertermittlungsverfahren = Wertermittlungsverfahren.MESSUNG, - einheit = Mengeneinheit.KWH, - wert = 5, - startdatum = new DateTime(2017, 12, 31, 23, 0, 0, DateTimeKind.Utc), - enddatum = new DateTime(2018, 1, 31, 23, 0, 0, DateTimeKind.Utc) + Obiskennzahl = "123", + Wertermittlungsverfahren = Wertermittlungsverfahren.MESSUNG, + Einheit = Mengeneinheit.KWH, + Wert = 5, + Startdatum = new DateTime(2017, 12, 31, 23, 0, 0, DateTimeKind.Utc), + Enddatum = new DateTime(2018, 1, 31, 23, 0, 0, DateTimeKind.Utc) }; Verbrauch v2 = new Verbrauch() { - obiskennzahl = "123", - wertermittlungsverfahren = Wertermittlungsverfahren.MESSUNG, - einheit = Mengeneinheit.KWH, - wert = 3, - startdatum = new DateTime(2018, 1, 31, 23, 0, 0, DateTimeKind.Utc), - enddatum = new DateTime(2018, 2, 28, 23, 0, 0, DateTimeKind.Utc) + Obiskennzahl = "123", + Wertermittlungsverfahren = Wertermittlungsverfahren.MESSUNG, + Einheit = Mengeneinheit.KWH, + Wert = 3, + Startdatum = new DateTime(2018, 1, 31, 23, 0, 0, DateTimeKind.Utc), + Enddatum = new DateTime(2018, 2, 28, 23, 0, 0, DateTimeKind.Utc) }; HashSet result = v1.Merge(v2); Assert.AreEqual(1, result.Count); - Assert.AreEqual(v1.startdatum, result.First().startdatum); - Assert.AreEqual(v2.enddatum, result.First().enddatum); - Assert.AreEqual(8, result.First().wert); + Assert.AreEqual(v1.Startdatum, result.First().Startdatum); + Assert.AreEqual(v2.Enddatum, result.First().Enddatum); + Assert.AreEqual(8, result.First().Wert); Assert.IsTrue(result.SetEquals(v2.Merge(v1))); } @@ -76,21 +76,21 @@ public void TestMergeAdjacentIntensive() { Verbrauch v1 = new Verbrauch() { - obiskennzahl = "123", - wertermittlungsverfahren = Wertermittlungsverfahren.MESSUNG, - einheit = Mengeneinheit.KW, - wert = 5, - startdatum = new DateTime(2017, 12, 31, 23, 0, 0, DateTimeKind.Utc), - enddatum = new DateTime(2018, 1, 31, 23, 0, 0, DateTimeKind.Utc) + Obiskennzahl = "123", + Wertermittlungsverfahren = Wertermittlungsverfahren.MESSUNG, + Einheit = Mengeneinheit.KW, + Wert = 5, + Startdatum = new DateTime(2017, 12, 31, 23, 0, 0, DateTimeKind.Utc), + Enddatum = new DateTime(2018, 1, 31, 23, 0, 0, DateTimeKind.Utc) }; Verbrauch v2 = new Verbrauch() { - obiskennzahl = "123", - wertermittlungsverfahren = Wertermittlungsverfahren.MESSUNG, - einheit = Mengeneinheit.KW, - wert = 3, - startdatum = new DateTime(2018, 1, 31, 23, 0, 0, DateTimeKind.Utc), - enddatum = new DateTime(2018, 2, 28, 23, 0, 0, DateTimeKind.Utc) + Obiskennzahl = "123", + Wertermittlungsverfahren = Wertermittlungsverfahren.MESSUNG, + Einheit = Mengeneinheit.KW, + Wert = 3, + Startdatum = new DateTime(2018, 1, 31, 23, 0, 0, DateTimeKind.Utc), + Enddatum = new DateTime(2018, 2, 28, 23, 0, 0, DateTimeKind.Utc) }; HashSet result12 = v1.Merge(v2); Assert.AreEqual(2, result12.Count); @@ -99,21 +99,21 @@ public void TestMergeAdjacentIntensive() Verbrauch v3 = new Verbrauch() { - obiskennzahl = "123", - wertermittlungsverfahren = Wertermittlungsverfahren.MESSUNG, - einheit = Mengeneinheit.KW, - wert = 5, - startdatum = new DateTime(2017, 12, 31, 23, 0, 0, DateTimeKind.Utc), - enddatum = new DateTime(2018, 1, 31, 23, 0, 0, DateTimeKind.Utc) + Obiskennzahl = "123", + Wertermittlungsverfahren = Wertermittlungsverfahren.MESSUNG, + Einheit = Mengeneinheit.KW, + Wert = 5, + Startdatum = new DateTime(2017, 12, 31, 23, 0, 0, DateTimeKind.Utc), + Enddatum = new DateTime(2018, 1, 31, 23, 0, 0, DateTimeKind.Utc) }; Verbrauch v4 = new Verbrauch() { - obiskennzahl = "123", - wertermittlungsverfahren = Wertermittlungsverfahren.MESSUNG, - einheit = Mengeneinheit.KW, - wert = 5, - startdatum = new DateTime(2018, 1, 31, 23, 0, 0, DateTimeKind.Utc), - enddatum = new DateTime(2018, 2, 28, 23, 0, 0, DateTimeKind.Utc) + Obiskennzahl = "123", + Wertermittlungsverfahren = Wertermittlungsverfahren.MESSUNG, + Einheit = Mengeneinheit.KW, + Wert = 5, + Startdatum = new DateTime(2018, 1, 31, 23, 0, 0, DateTimeKind.Utc), + Enddatum = new DateTime(2018, 2, 28, 23, 0, 0, DateTimeKind.Utc) }; HashSet result34 = v3.Merge(v4); //Assert.AreEqual(1, result34.Count); @@ -127,27 +127,27 @@ public void TestMergeOverlappingExtensive() { Verbrauch v1 = new Verbrauch() { - obiskennzahl = "123", - wertermittlungsverfahren = Wertermittlungsverfahren.MESSUNG, - einheit = Mengeneinheit.KWH, - wert = 5, - startdatum = new DateTime(2017, 12, 31, 23, 0, 0, DateTimeKind.Utc), - enddatum = new DateTime(2018, 1, 31, 23, 0, 0, DateTimeKind.Utc) + Obiskennzahl = "123", + Wertermittlungsverfahren = Wertermittlungsverfahren.MESSUNG, + Einheit = Mengeneinheit.KWH, + Wert = 5, + Startdatum = new DateTime(2017, 12, 31, 23, 0, 0, DateTimeKind.Utc), + Enddatum = new DateTime(2018, 1, 31, 23, 0, 0, DateTimeKind.Utc) }; Verbrauch v2 = new Verbrauch() { - obiskennzahl = "123", - wertermittlungsverfahren = Wertermittlungsverfahren.MESSUNG, - einheit = Mengeneinheit.KWH, - wert = 3, - startdatum = new DateTime(2018, 1, 15, 23, 0, 0, DateTimeKind.Utc), - enddatum = new DateTime(2018, 2, 28, 23, 0, 0, DateTimeKind.Utc) + Obiskennzahl = "123", + Wertermittlungsverfahren = Wertermittlungsverfahren.MESSUNG, + Einheit = Mengeneinheit.KWH, + Wert = 3, + Startdatum = new DateTime(2018, 1, 15, 23, 0, 0, DateTimeKind.Utc), + Enddatum = new DateTime(2018, 2, 28, 23, 0, 0, DateTimeKind.Utc) }; HashSet result = v1.Merge(v2); Assert.AreEqual(1, result.Count); - Assert.AreEqual(v1.startdatum, result.First().startdatum); - Assert.AreEqual(v2.enddatum, result.First().enddatum); - Assert.AreEqual(8, result.First().wert); + Assert.AreEqual(v1.Startdatum, result.First().Startdatum); + Assert.AreEqual(v2.Enddatum, result.First().Enddatum); + Assert.AreEqual(8, result.First().Wert); Assert.IsTrue(result.SetEquals(v2.Merge(v1))); } @@ -158,33 +158,33 @@ public void TestMergeOverlappingIntensive() { Verbrauch v1 = new Verbrauch() { - obiskennzahl = "123", - wertermittlungsverfahren = Wertermittlungsverfahren.MESSUNG, - einheit = Mengeneinheit.KW, - wert = 5, - startdatum = new DateTime(2017, 12, 31, 23, 0, 0, DateTimeKind.Utc), - enddatum = new DateTime(2018, 1, 31, 23, 0, 0, DateTimeKind.Utc) + Obiskennzahl = "123", + Wertermittlungsverfahren = Wertermittlungsverfahren.MESSUNG, + Einheit = Mengeneinheit.KW, + Wert = 5, + Startdatum = new DateTime(2017, 12, 31, 23, 0, 0, DateTimeKind.Utc), + Enddatum = new DateTime(2018, 1, 31, 23, 0, 0, DateTimeKind.Utc) }; Verbrauch v2 = new Verbrauch() { - obiskennzahl = "123", - wertermittlungsverfahren = Wertermittlungsverfahren.MESSUNG, - einheit = Mengeneinheit.KW, - wert = 3, - startdatum = new DateTime(2018, 1, 15, 23, 0, 0, DateTimeKind.Utc), - enddatum = new DateTime(2018, 2, 28, 23, 0, 0, DateTimeKind.Utc) + Obiskennzahl = "123", + Wertermittlungsverfahren = Wertermittlungsverfahren.MESSUNG, + Einheit = Mengeneinheit.KW, + Wert = 3, + Startdatum = new DateTime(2018, 1, 15, 23, 0, 0, DateTimeKind.Utc), + Enddatum = new DateTime(2018, 2, 28, 23, 0, 0, DateTimeKind.Utc) }; var rawResult = v1.Merge(v2); List result = new List(rawResult); Assert.AreEqual(3, result.Count); result.Sort(new VerbrauchDateTimeComparer()); - Assert.AreEqual(v1.startdatum, result.First().startdatum); - Assert.AreEqual(5, result.First().wert); - Assert.AreEqual(v2.startdatum, result[1].startdatum); - Assert.AreEqual(v1.enddatum, result[1].enddatum); - Assert.AreEqual(8, result[1].wert); - Assert.AreEqual(v2.enddatum, result.Last().enddatum); - Assert.AreEqual(3, result.Last().wert); + Assert.AreEqual(v1.Startdatum, result.First().Startdatum); + Assert.AreEqual(5, result.First().Wert); + Assert.AreEqual(v2.Startdatum, result[1].Startdatum); + Assert.AreEqual(v1.Enddatum, result[1].Enddatum); + Assert.AreEqual(8, result[1].Wert); + Assert.AreEqual(v2.Enddatum, result.Last().Enddatum); + Assert.AreEqual(3, result.Last().Wert); Assert.IsTrue(rawResult.SetEquals(v2.Merge(v1))); } @@ -194,28 +194,28 @@ public void TestMergeRedundantIntensiveSameTime() { Verbrauch v1 = new Verbrauch() { - obiskennzahl = "123", - wertermittlungsverfahren = Wertermittlungsverfahren.MESSUNG, - einheit = Mengeneinheit.KW, - wert = 5, - startdatum = new DateTime(2017, 12, 31, 23, 0, 0, DateTimeKind.Utc), - enddatum = new DateTime(2018, 1, 31, 23, 0, 0, DateTimeKind.Utc) + Obiskennzahl = "123", + Wertermittlungsverfahren = Wertermittlungsverfahren.MESSUNG, + Einheit = Mengeneinheit.KW, + Wert = 5, + Startdatum = new DateTime(2017, 12, 31, 23, 0, 0, DateTimeKind.Utc), + Enddatum = new DateTime(2018, 1, 31, 23, 0, 0, DateTimeKind.Utc) }; Verbrauch v2 = new Verbrauch() { - obiskennzahl = "123", - wertermittlungsverfahren = Wertermittlungsverfahren.MESSUNG, - einheit = Mengeneinheit.KW, - wert = 5, - startdatum = new DateTime(2017, 12, 31, 23, 0, 0, DateTimeKind.Utc), - enddatum = new DateTime(2018, 1, 31, 23, 0, 0, DateTimeKind.Utc) + Obiskennzahl = "123", + Wertermittlungsverfahren = Wertermittlungsverfahren.MESSUNG, + Einheit = Mengeneinheit.KW, + Wert = 5, + Startdatum = new DateTime(2017, 12, 31, 23, 0, 0, DateTimeKind.Utc), + Enddatum = new DateTime(2018, 1, 31, 23, 0, 0, DateTimeKind.Utc) }; var rawResult = v1.MergeRedundant(v2, true); List result = new List(rawResult); Assert.AreEqual(1, result.Count); Assert.AreEqual(v1, v2); Assert.AreEqual(v1, result.First()); - Assert.AreEqual(5, result.First().wert); + Assert.AreEqual(5, result.First().Wert); } [TestMethod] @@ -223,26 +223,26 @@ public void TestMergeRedundantExtensiveSameTime() { Verbrauch v1 = new Verbrauch() { - obiskennzahl = "123", - wertermittlungsverfahren = Wertermittlungsverfahren.MESSUNG, - einheit = Mengeneinheit.KWH, - wert = 5, - startdatum = new DateTime(2017, 12, 31, 23, 0, 0, DateTimeKind.Utc), - enddatum = new DateTime(2018, 1, 31, 23, 0, 0, DateTimeKind.Utc) + Obiskennzahl = "123", + Wertermittlungsverfahren = Wertermittlungsverfahren.MESSUNG, + Einheit = Mengeneinheit.KWH, + Wert = 5, + Startdatum = new DateTime(2017, 12, 31, 23, 0, 0, DateTimeKind.Utc), + Enddatum = new DateTime(2018, 1, 31, 23, 0, 0, DateTimeKind.Utc) }; Verbrauch v2 = new Verbrauch() { - obiskennzahl = "123", - wertermittlungsverfahren = Wertermittlungsverfahren.MESSUNG, - einheit = Mengeneinheit.KWH, - wert = 5, - startdatum = new DateTime(2017, 12, 31, 23, 0, 0, DateTimeKind.Utc), - enddatum = new DateTime(2018, 1, 31, 23, 0, 0, DateTimeKind.Utc) + Obiskennzahl = "123", + Wertermittlungsverfahren = Wertermittlungsverfahren.MESSUNG, + Einheit = Mengeneinheit.KWH, + Wert = 5, + Startdatum = new DateTime(2017, 12, 31, 23, 0, 0, DateTimeKind.Utc), + Enddatum = new DateTime(2018, 1, 31, 23, 0, 0, DateTimeKind.Utc) }; var rawResult = v1.MergeRedundant(v2, true); List result = new List(rawResult); Assert.AreEqual(1, result.Count); - Assert.AreEqual(5, result.First().wert); + Assert.AreEqual(5, result.First().Wert); } @@ -251,21 +251,21 @@ public void TestMergeRedundantExtensiveLeftJustifiedOverlap() { Verbrauch v1 = new Verbrauch() { - obiskennzahl = "123", - wertermittlungsverfahren = Wertermittlungsverfahren.MESSUNG, - einheit = Mengeneinheit.KWH, - wert = 5, - startdatum = new DateTime(2017, 12, 31, 23, 0, 0, DateTimeKind.Utc), - enddatum = new DateTime(2018, 2, 28, 23, 0, 0, DateTimeKind.Utc) + Obiskennzahl = "123", + Wertermittlungsverfahren = Wertermittlungsverfahren.MESSUNG, + Einheit = Mengeneinheit.KWH, + Wert = 5, + Startdatum = new DateTime(2017, 12, 31, 23, 0, 0, DateTimeKind.Utc), + Enddatum = new DateTime(2018, 2, 28, 23, 0, 0, DateTimeKind.Utc) }; Verbrauch v2 = new Verbrauch() { - obiskennzahl = "123", - wertermittlungsverfahren = Wertermittlungsverfahren.MESSUNG, - einheit = Mengeneinheit.KWH, - wert = 3, - startdatum = new DateTime(2017, 12, 31, 23, 0, 0, DateTimeKind.Utc), - enddatum = new DateTime(2018, 1, 31, 23, 0, 0, DateTimeKind.Utc) + Obiskennzahl = "123", + Wertermittlungsverfahren = Wertermittlungsverfahren.MESSUNG, + Einheit = Mengeneinheit.KWH, + Wert = 3, + Startdatum = new DateTime(2017, 12, 31, 23, 0, 0, DateTimeKind.Utc), + Enddatum = new DateTime(2018, 1, 31, 23, 0, 0, DateTimeKind.Utc) }; var rawResult = v1.MergeRedundant(v2, true); @@ -273,13 +273,13 @@ public void TestMergeRedundantExtensiveLeftJustifiedOverlap() result.Sort(new VerbrauchDateTimeComparer()); Assert.AreEqual(1, result.Count); - Assert.AreEqual(2, result.First().wert); - Assert.AreEqual(new DateTime(2017, 12, 31, 23, 0, 0, DateTimeKind.Utc), result.First().startdatum); + Assert.AreEqual(2, result.First().Wert); + Assert.AreEqual(new DateTime(2017, 12, 31, 23, 0, 0, DateTimeKind.Utc), result.First().Startdatum); //Assert.AreEqual(new DateTime(2018, 1, 31, 23, 0, 0, DateTimeKind.Utc), result.First().enddatum); //Assert.AreEqual(5, result.Last().wert); //Assert.AreEqual(new DateTime(2018, 1, 31, 23, 0, 0, DateTimeKind.Utc), result.Last().startdatum); - Assert.AreEqual(new DateTime(2018, 2, 28, 23, 0, 0, DateTimeKind.Utc), result.Last().enddatum); + Assert.AreEqual(new DateTime(2018, 2, 28, 23, 0, 0, DateTimeKind.Utc), result.Last().Enddatum); } @@ -293,39 +293,39 @@ public void TestMergeRedundantRightJustifiedOverlap() result.Sort(new VerbrauchDateTimeComparer()); Assert.AreEqual(1, result.Count); - Assert.AreEqual(2450.0M, result.First().wert); - Assert.AreEqual(new DateTime(2018, 9, 1, 0, 0, 0, DateTimeKind.Utc), result.First().startdatum); - Assert.AreEqual(new DateTime(2019, 12, 25, 08, 20, 0, DateTimeKind.Utc), result.First().enddatum); + Assert.AreEqual(2450.0M, result.First().Wert); + Assert.AreEqual(new DateTime(2018, 9, 1, 0, 0, 0, DateTimeKind.Utc), result.First().Startdatum); + Assert.AreEqual(new DateTime(2019, 12, 25, 08, 20, 0, DateTimeKind.Utc), result.First().Enddatum); } private static readonly Verbrauch dtV1 = new Verbrauch() { - obiskennzahl = "123", - wertermittlungsverfahren = Wertermittlungsverfahren.MESSUNG, - einheit = Mengeneinheit.KWH, - wert = 31 + 2 * 28, - startdatum = new DateTime(2017, 12, 31, 23, 0, 0, DateTimeKind.Utc), - enddatum = new DateTime(2018, 2, 28, 23, 0, 0, DateTimeKind.Utc) + Obiskennzahl = "123", + Wertermittlungsverfahren = Wertermittlungsverfahren.MESSUNG, + Einheit = Mengeneinheit.KWH, + Wert = 31 + 2 * 28, + Startdatum = new DateTime(2017, 12, 31, 23, 0, 0, DateTimeKind.Utc), + Enddatum = new DateTime(2018, 2, 28, 23, 0, 0, DateTimeKind.Utc) }; private static readonly Verbrauch dtV2 = new Verbrauch() { - obiskennzahl = "123", - wertermittlungsverfahren = Wertermittlungsverfahren.MESSUNG, - einheit = Mengeneinheit.KWH, - wert = 31, - startdatum = new DateTime(2017, 12, 31, 23, 0, 0, DateTimeKind.Utc), - enddatum = new DateTime(2018, 1, 31, 23, 0, 0, DateTimeKind.Utc) + Obiskennzahl = "123", + Wertermittlungsverfahren = Wertermittlungsverfahren.MESSUNG, + Einheit = Mengeneinheit.KWH, + Wert = 31, + Startdatum = new DateTime(2017, 12, 31, 23, 0, 0, DateTimeKind.Utc), + Enddatum = new DateTime(2018, 1, 31, 23, 0, 0, DateTimeKind.Utc) }; private static readonly Verbrauch dtV3 = new Verbrauch() { - obiskennzahl = "123", - wertermittlungsverfahren = Wertermittlungsverfahren.MESSUNG, - einheit = Mengeneinheit.KWH, - wert = 31 + 2 * 28 + 3 * 31, - startdatum = new DateTime(2017, 12, 31, 23, 0, 0, DateTimeKind.Utc), - enddatum = new DateTime(2018, 3, 31, 23, 0, 0, DateTimeKind.Utc) + Obiskennzahl = "123", + Wertermittlungsverfahren = Wertermittlungsverfahren.MESSUNG, + Einheit = Mengeneinheit.KWH, + Wert = 31 + 2 * 28 + 3 * 31, + Startdatum = new DateTime(2017, 12, 31, 23, 0, 0, DateTimeKind.Utc), + Enddatum = new DateTime(2018, 3, 31, 23, 0, 0, DateTimeKind.Utc) }; [TestMethod] @@ -334,12 +334,12 @@ public void TestDetangleTwofold() var result = Detangle(new List { dtV1, dtV2 }); result.Sort(new VerbrauchDateTimeComparer()); Assert.AreEqual(2, result.Count); - Assert.AreEqual(new DateTime(2017, 12, 31, 23, 0, 0, DateTimeKind.Utc), result.First().startdatum); - Assert.AreEqual(new DateTime(2018, 1, 31, 23, 0, 0, DateTimeKind.Utc), result.First().enddatum); - Assert.AreEqual(31, result.First().wert); - Assert.AreEqual(new DateTime(2018, 1, 31, 23, 0, 0, DateTimeKind.Utc), result.Last().startdatum); - Assert.AreEqual(new DateTime(2018, 2, 28, 23, 0, 0, DateTimeKind.Utc), result.Last().enddatum); - Assert.AreEqual(2 * 28, result.Last().wert); + Assert.AreEqual(new DateTime(2017, 12, 31, 23, 0, 0, DateTimeKind.Utc), result.First().Startdatum); + Assert.AreEqual(new DateTime(2018, 1, 31, 23, 0, 0, DateTimeKind.Utc), result.First().Enddatum); + Assert.AreEqual(31, result.First().Wert); + Assert.AreEqual(new DateTime(2018, 1, 31, 23, 0, 0, DateTimeKind.Utc), result.Last().Startdatum); + Assert.AreEqual(new DateTime(2018, 2, 28, 23, 0, 0, DateTimeKind.Utc), result.Last().Enddatum); + Assert.AreEqual(2 * 28, result.Last().Wert); } [TestMethod] @@ -348,48 +348,48 @@ public void TestDetangleThreefold() var result = Detangle(new List { dtV1, dtV2, dtV3 }); result.Sort(new VerbrauchDateTimeComparer()); Assert.AreEqual(3, result.Count); - Assert.AreEqual(new DateTime(2017, 12, 31, 23, 0, 0, 0, DateTimeKind.Utc), result[0].startdatum); - Assert.AreEqual(new DateTime(2018, 1, 31, 23, 0, 0, 0, DateTimeKind.Utc), result[0].enddatum); - Assert.AreEqual(31, result[0].wert); - Assert.AreEqual(new DateTime(2018, 1, 31, 23, 0, 0, 0, DateTimeKind.Utc), result[1].startdatum); - Assert.AreEqual(new DateTime(2018, 2, 28, 23, 0, 0, 0, DateTimeKind.Utc), result[1].enddatum); - Assert.AreEqual(2 * 28, result[1].wert); - Assert.AreEqual(new DateTime(2018, 2, 28, 23, 0, 0, 0, DateTimeKind.Utc), result[2].startdatum); - Assert.AreEqual(new DateTime(2018, 3, 31, 23, 0, 0, 0, DateTimeKind.Utc), result[2].enddatum); - Assert.AreEqual(3 * 31, result[2].wert); + Assert.AreEqual(new DateTime(2017, 12, 31, 23, 0, 0, 0, DateTimeKind.Utc), result[0].Startdatum); + Assert.AreEqual(new DateTime(2018, 1, 31, 23, 0, 0, 0, DateTimeKind.Utc), result[0].Enddatum); + Assert.AreEqual(31, result[0].Wert); + Assert.AreEqual(new DateTime(2018, 1, 31, 23, 0, 0, 0, DateTimeKind.Utc), result[1].Startdatum); + Assert.AreEqual(new DateTime(2018, 2, 28, 23, 0, 0, 0, DateTimeKind.Utc), result[1].Enddatum); + Assert.AreEqual(2 * 28, result[1].Wert); + Assert.AreEqual(new DateTime(2018, 2, 28, 23, 0, 0, 0, DateTimeKind.Utc), result[2].Startdatum); + Assert.AreEqual(new DateTime(2018, 3, 31, 23, 0, 0, 0, DateTimeKind.Utc), result[2].Enddatum); + Assert.AreEqual(3 * 31, result[2].Wert); } [TestMethod] public void TestHfSapDataDetangle() { List testList = JsonConvert.DeserializeObject>("[{\"startdatum\":\"2000-01-01T00:00:00Z\",\"enddatum\":\"2018-09-01T00:00:00Z\",\"wertermittlungsverfahren\":1,\"obiskennzahl\":\"1-1:1.8.0\",\"wert\":50,\"einheit\":2,\"zaehlernummer\":\"10000548\"},{\"startdatum\":\"2000-01-01T00:00:00Z\",\"enddatum\":\"2018-12-25T16:22:00Z\",\"wertermittlungsverfahren\":0,\"obiskennzahl\":\"1-1:1.8.0\",\"wert\":961,\"einheit\":2,\"zaehlernummer\":\"10000548\"},{\"startdatum\":\"2000-01-01T00:00:00Z\",\"enddatum\":\"2019-12-25T08:20:00Z\",\"wertermittlungsverfahren\":1,\"obiskennzahl\":\"1-1:1.8.0\",\"wert\":2500,\"einheit\":2,\"zaehlernummer\":\"10000548\"},{\"startdatum\":\"2018-09-01T00:00:00Z\",\"enddatum\":\"2018-12-25T16:22:00Z\",\"wertermittlungsverfahren\":0,\"obiskennzahl\":\"1-1:1.8.0\",\"wert\":911,\"einheit\":2,\"zaehlernummer\":\"10000548\"},{\"startdatum\":\"2018-09-01T00:00:00Z\",\"enddatum\":\"2019-12-25T08:20:00Z\",\"wertermittlungsverfahren\":1,\"obiskennzahl\":\"1-1:1.8.0\",\"wert\":2450,\"einheit\":2,\"zaehlernummer\":\"10000548\"},{\"startdatum\":\"2018-12-25T16:22:00Z\",\"enddatum\":\"2019-12-25T08:20:00Z\",\"wertermittlungsverfahren\":0,\"obiskennzahl\":\"1-1:1.8.0\",\"wert\":1539,\"einheit\":2,\"zaehlernummer\":\"10000548\"}]"); - Assert.AreEqual(3, testList.Where(v => v.wertermittlungsverfahren == Wertermittlungsverfahren.MESSUNG).Count()); - Assert.AreEqual(3, testList.Where(v => v.wertermittlungsverfahren == Wertermittlungsverfahren.PROGNOSE).Count()); + Assert.AreEqual(3, testList.Where(v => v.Wertermittlungsverfahren == Wertermittlungsverfahren.MESSUNG).Count()); + Assert.AreEqual(3, testList.Where(v => v.Wertermittlungsverfahren == Wertermittlungsverfahren.PROGNOSE).Count()); var result = Detangle(testList); result.Sort(new VerbrauchDateTimeComparer()); //Assert.AreEqual(5, result.Count); - var subResultMessung = result.Where(v => v.wertermittlungsverfahren == Wertermittlungsverfahren.MESSUNG).ToList(); + var subResultMessung = result.Where(v => v.Wertermittlungsverfahren == Wertermittlungsverfahren.MESSUNG).ToList(); Assert.AreEqual(2, subResultMessung.Count); - Assert.AreEqual(new DateTime(2000, 1, 1, 0, 0, 0, DateTimeKind.Utc), subResultMessung[0].startdatum); - Assert.AreEqual(new DateTime(2018, 9, 1, 0, 0, 0, DateTimeKind.Utc), subResultMessung[0].enddatum); - Assert.AreEqual(50, subResultMessung[0].wert); - Assert.AreEqual(new DateTime(2018, 9, 1, 0, 0, 0, DateTimeKind.Utc), subResultMessung[1].startdatum); - Assert.AreEqual(new DateTime(2019, 12, 25, 8, 20, 0, DateTimeKind.Utc), subResultMessung[1].enddatum); - Assert.AreEqual(2450, subResultMessung[1].wert); + Assert.AreEqual(new DateTime(2000, 1, 1, 0, 0, 0, DateTimeKind.Utc), subResultMessung[0].Startdatum); + Assert.AreEqual(new DateTime(2018, 9, 1, 0, 0, 0, DateTimeKind.Utc), subResultMessung[0].Enddatum); + Assert.AreEqual(50, subResultMessung[0].Wert); + Assert.AreEqual(new DateTime(2018, 9, 1, 0, 0, 0, DateTimeKind.Utc), subResultMessung[1].Startdatum); + Assert.AreEqual(new DateTime(2019, 12, 25, 8, 20, 0, DateTimeKind.Utc), subResultMessung[1].Enddatum); + Assert.AreEqual(2450, subResultMessung[1].Wert); - var subResultPrognose = result.Where(v => v.wertermittlungsverfahren == Wertermittlungsverfahren.PROGNOSE).ToList(); + var subResultPrognose = result.Where(v => v.Wertermittlungsverfahren == Wertermittlungsverfahren.PROGNOSE).ToList(); Assert.AreEqual(3, subResultPrognose.Count); - Assert.AreEqual(new DateTime(2000, 1, 1, 0, 0, 0, DateTimeKind.Utc), subResultPrognose[0].startdatum); - Assert.AreEqual(new DateTime(2018, 9, 1, 0, 0, 0, DateTimeKind.Utc), subResultPrognose[0].enddatum); - Assert.AreEqual(50, subResultPrognose[0].wert); - Assert.AreEqual(new DateTime(2018, 9, 1, 0, 0, 0, DateTimeKind.Utc), subResultPrognose[1].startdatum); - Assert.AreEqual(new DateTime(2018, 12, 25, 16, 22, 0, DateTimeKind.Utc), subResultPrognose[1].enddatum); - Assert.AreEqual(911, subResultPrognose[1].wert); - Assert.AreEqual(new DateTime(2018, 12, 25, 16, 22, 0, DateTimeKind.Utc), subResultPrognose[2].startdatum); - Assert.AreEqual(new DateTime(2019, 12, 25, 8, 20, 0, DateTimeKind.Utc), subResultPrognose[2].enddatum); - Assert.AreEqual(1539, subResultPrognose[2].wert); + Assert.AreEqual(new DateTime(2000, 1, 1, 0, 0, 0, DateTimeKind.Utc), subResultPrognose[0].Startdatum); + Assert.AreEqual(new DateTime(2018, 9, 1, 0, 0, 0, DateTimeKind.Utc), subResultPrognose[0].Enddatum); + Assert.AreEqual(50, subResultPrognose[0].Wert); + Assert.AreEqual(new DateTime(2018, 9, 1, 0, 0, 0, DateTimeKind.Utc), subResultPrognose[1].Startdatum); + Assert.AreEqual(new DateTime(2018, 12, 25, 16, 22, 0, DateTimeKind.Utc), subResultPrognose[1].Enddatum); + Assert.AreEqual(911, subResultPrognose[1].Wert); + Assert.AreEqual(new DateTime(2018, 12, 25, 16, 22, 0, DateTimeKind.Utc), subResultPrognose[2].Startdatum); + Assert.AreEqual(new DateTime(2019, 12, 25, 8, 20, 0, DateTimeKind.Utc), subResultPrognose[2].Enddatum); + Assert.AreEqual(1539, subResultPrognose[2].Wert); } [TestMethod] @@ -397,16 +397,16 @@ public void TestUnitConversion() { Verbrauch v1 = new Verbrauch() { - obiskennzahl = "123", - wertermittlungsverfahren = Wertermittlungsverfahren.MESSUNG, - einheit = Mengeneinheit.MW, - wert = 17, - startdatum = new DateTime(2017, 12, 31, 23, 0, 0, DateTimeKind.Utc), - enddatum = new DateTime(2018, 3, 31, 23, 0, 0, DateTimeKind.Utc) + Obiskennzahl = "123", + Wertermittlungsverfahren = Wertermittlungsverfahren.MESSUNG, + Einheit = Mengeneinheit.MW, + Wert = 17, + Startdatum = new DateTime(2017, 12, 31, 23, 0, 0, DateTimeKind.Utc), + Enddatum = new DateTime(2018, 3, 31, 23, 0, 0, DateTimeKind.Utc) }; v1.ConvertToUnit(Mengeneinheit.KW); - Assert.AreEqual(Mengeneinheit.KW, v1.einheit); - Assert.AreEqual(17000.0M, v1.wert); + Assert.AreEqual(Mengeneinheit.KW, v1.Einheit); + Assert.AreEqual(17000.0M, v1.Wert); Assert.ThrowsException(() => v1.ConvertToUnit(Mengeneinheit.KWH)); } diff --git a/TestBO4E-dotnet-Reporting/ShowCaseTests/CompletenessReportShowCaseTests.cs b/TestBO4E-dotnet-Reporting/ShowCaseTests/CompletenessReportShowCaseTests.cs new file mode 100644 index 00000000..c7492f96 --- /dev/null +++ b/TestBO4E-dotnet-Reporting/ShowCaseTests/CompletenessReportShowCaseTests.cs @@ -0,0 +1,54 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; + +using BO4E.BO; +using BO4E.COM; +using BO4E.ENUM; +using BO4E.Extensions.BusinessObjects.Energiemenge; + +using Microsoft.VisualStudio.TestTools.UnitTesting; + +namespace TestBO4E.ShowCaseTests +{ + [TestClass] + public class CompletenessReportShowCaseTests + { + [TestMethod] + public void ShowCaseTest() + { + var em = new Energiemenge() + { + LokationsId = "DE0123456789012345678901234567890", + LokationsTyp = Lokationstyp.MeLo, + Energieverbrauch = new List() + { + new Verbrauch() + { + Einheit = Mengeneinheit.KWH, + Startdatum = new DateTime(2020,3,1,0,0,0,DateTimeKind.Utc), + Enddatum = new DateTime(2020,3,8,0,0,0,DateTimeKind.Utc), + Wert = 456.0M, + Wertermittlungsverfahren = Wertermittlungsverfahren.MESSUNG + }, + new Verbrauch() + { + Einheit = Mengeneinheit.KWH, + Startdatum = new DateTime(2020,3,25,0,0,0,DateTimeKind.Utc), + Enddatum = new DateTime(2020,4,1,0,0,0,DateTimeKind.Utc), + Wert = 123.0M, + Wertermittlungsverfahren = Wertermittlungsverfahren.MESSUNG + } + } + }; + + var cr = em.GetCompletenessReport(); + Debug.WriteLine($"{nameof(em)} has a coverage of {Decimal.Round(cr.Coverage.Value * 100.0M)}%."); + // em has a coverage of 45%. + + Debug.WriteLine($"{nameof(em)} has no values for the following intervals: {string.Join(", ", cr.Gaps.Select(g => g.Startdatum.ToString("yyyy-MM-dd") + " to " + g.Enddatum.ToString("yyyy-MM-dd")))}"); + // em has no values for the following intervals: 2020-03-08 to 2020-03-25 + } + } +} diff --git a/TestBO4E-dotnet-Reporting/TestBO4E-dotnet-Reporting.csproj b/TestBO4E-dotnet-Reporting/TestBO4E-dotnet-Reporting.csproj index 3b836db7..f7939693 100644 --- a/TestBO4E-dotnet-Reporting/TestBO4E-dotnet-Reporting.csproj +++ b/TestBO4E-dotnet-Reporting/TestBO4E-dotnet-Reporting.csproj @@ -11,10 +11,14 @@ - + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + diff --git a/TestBO4E-dotnet-Reporting/TestCompletenessReportSorting.cs b/TestBO4E-dotnet-Reporting/TestCompletenessReportSorting.cs index d72f1777..c74ae0bd 100644 --- a/TestBO4E-dotnet-Reporting/TestCompletenessReportSorting.cs +++ b/TestBO4E-dotnet-Reporting/TestCompletenessReportSorting.cs @@ -12,50 +12,50 @@ public void TestStartdatumSorting() { BO4E.Reporting.CompletenessReport cr1 = new BO4E.Reporting.CompletenessReport() { - referenceTimeFrame = new BO4E.COM.Zeitraum() + ReferenceTimeFrame = new BO4E.COM.Zeitraum() { - startdatum = new System.DateTime(2001, 1, 1, 0, 0, 0, System.DateTimeKind.Utc) + Startdatum = new System.DateTime(2001, 1, 1, 0, 0, 0, System.DateTimeKind.Utc) } }; BO4E.Reporting.CompletenessReport cr2 = new BO4E.Reporting.CompletenessReport() { - referenceTimeFrame = new BO4E.COM.Zeitraum() + ReferenceTimeFrame = new BO4E.COM.Zeitraum() { - startdatum = new System.DateTime(2002, 1, 1, 0, 0, 0, System.DateTimeKind.Utc) + Startdatum = new System.DateTime(2002, 1, 1, 0, 0, 0, System.DateTimeKind.Utc) } }; BO4E.Reporting.CompletenessReport cr3 = new BO4E.Reporting.CompletenessReport() { - referenceTimeFrame = new BO4E.COM.Zeitraum() + ReferenceTimeFrame = new BO4E.COM.Zeitraum() { - startdatum = new System.DateTime(2003, 1, 1, 0, 0, 0, System.DateTimeKind.Utc) + Startdatum = new System.DateTime(2003, 1, 1, 0, 0, 0, System.DateTimeKind.Utc) } }; List crList = new List() { cr2, cr3, cr1 }; // before sorting - Assert.IsTrue(crList.First().referenceTimeFrame.startdatum.Value.Year == 2002); - Assert.IsTrue(crList[1].referenceTimeFrame.startdatum.Value.Year == 2003); - Assert.IsTrue(crList.Last().referenceTimeFrame.startdatum.Value.Year == 2001); + Assert.IsTrue(crList.First().ReferenceTimeFrame.Startdatum.Value.Year == 2002); + Assert.IsTrue(crList[1].ReferenceTimeFrame.Startdatum.Value.Year == 2003); + Assert.IsTrue(crList.Last().ReferenceTimeFrame.Startdatum.Value.Year == 2001); crList.Sort(); //after sorting - Assert.IsTrue(crList.First().referenceTimeFrame.startdatum.Value.Year == 2001); - Assert.IsTrue(crList[1].referenceTimeFrame.startdatum.Value.Year == 2002); - Assert.IsTrue(crList.Last().referenceTimeFrame.startdatum.Value.Year == 2003); + Assert.IsTrue(crList.First().ReferenceTimeFrame.Startdatum.Value.Year == 2001); + Assert.IsTrue(crList[1].ReferenceTimeFrame.Startdatum.Value.Year == 2002); + Assert.IsTrue(crList.Last().ReferenceTimeFrame.Startdatum.Value.Year == 2003); BO4E.Reporting.CompletenessReport crNull = new BO4E.Reporting.CompletenessReport(); crList.Add(crNull); BO4E.Reporting.CompletenessReport cr0 = new BO4E.Reporting.CompletenessReport() { - referenceTimeFrame = new BO4E.COM.Zeitraum() + ReferenceTimeFrame = new BO4E.COM.Zeitraum() { - startdatum = new System.DateTime(1999, 1, 1, 0, 0, 0, System.DateTimeKind.Utc) + Startdatum = new System.DateTime(1999, 1, 1, 0, 0, 0, System.DateTimeKind.Utc) } }; crList.Add(cr0); crList.Sort(); - Assert.IsNull(crList.First().referenceTimeFrame); - Assert.IsTrue(crList[1].referenceTimeFrame.startdatum.Value.Year == 1999); + Assert.IsNull(crList.First().ReferenceTimeFrame); + Assert.IsTrue(crList[1].ReferenceTimeFrame.Startdatum.Value.Year == 1999); } } } diff --git a/TestBO4E-dotnet-Reporting/TestReportToCsv.cs b/TestBO4E-dotnet-Reporting/TestReportToCsv.cs index 22a3c79d..b1552a28 100644 --- a/TestBO4E-dotnet-Reporting/TestReportToCsv.cs +++ b/TestBO4E-dotnet-Reporting/TestReportToCsv.cs @@ -1,10 +1,12 @@ using System; using System.Collections.Generic; -using System.Globalization; using System.Linq; using System.Threading; + using BO4E.Reporting; + using Microsoft.VisualStudio.TestTools.UnitTesting; + using Newtonsoft.Json; namespace TestBO4E.Reporting @@ -17,13 +19,13 @@ public void TestCompletenessReportToCsv() { CompletenessReport cr = new CompletenessReport() { - lokationsId = "DE12345", - coverage = 0.87M, // 87% + LokationsId = "DE12345", + Coverage = 0.87M, // 87% wertermittlungsverfahren = BO4E.ENUM.Wertermittlungsverfahren.PROGNOSE, - referenceTimeFrame = new BO4E.COM.Zeitraum() + ReferenceTimeFrame = new BO4E.COM.Zeitraum() { - startdatum = new DateTime(2019, 1, 1, 0, 0, 0, DateTimeKind.Utc), - enddatum = new DateTime(2019, 3, 1, 0, 0, 0, DateTimeKind.Utc) + Startdatum = new DateTime(2019, 1, 1, 0, 0, 0, DateTimeKind.Utc), + Enddatum = new DateTime(2019, 3, 1, 0, 0, 0, DateTimeKind.Utc) }, }; string result = cr.ToCsv(';', true, Environment.NewLine); @@ -33,10 +35,10 @@ public void TestCompletenessReportToCsv() // reihenfolge List> reihenfolge = new List> { - new Dictionary() { ["lokationsId"] = "messlokationsId" }, - new Dictionary() { ["coverage"] = "Newcoverage" }, - new Dictionary() { ["Zeitraum.startdatum"] = "time.startdatum" }, - new Dictionary() { ["Zeitraum.enddatum"] = "time.enddatum" } + new Dictionary() { ["LokationsId"] = "messlokationsId" }, + new Dictionary() { ["Coverage"] = "Newcoverage" }, + new Dictionary() { ["Zeitraum.Startdatum"] = "time.startdatum" }, + new Dictionary() { ["Zeitraum.Enddatum"] = "time.enddatum" } }; //string JSONdata = "{'completenessZfa':[{'lokationsId':'lokationsId'},{'coverage':'coverage'},{'Zeitraum.einheit':'einheit'},{'Zeitraum.dauer':'dauer'},{'Zeitraum.startdatum':'startdatum'},{'Zeitraum.enddatum':'enddatum'},{'obiskennzahl':'obiskennzahl'},{'einheit':'einheit'},{'wertermittlungsverfahren':'wertermittlungsverfahren'},{'startdatum':'Verbrauch.startdatum'},{'enddatum':'Verbrauch.enddatum'},{'wert':'Verbrauch.wert'},{'headerLine':'1'}]}"; @@ -46,11 +48,6 @@ public void TestCompletenessReportToCsv() var Newresult = cr.ToCsv(';', true, Environment.NewLine, reihenfolge); lines = new List(Newresult.Split(Environment.NewLine)); Assert.AreEqual(2, lines.Count); - var headerline = lines.First(); - //for (int i = 0; i < reihenfolge.Count; i++) - //{ - // Assert.AreEqual(reihenfolge[i].Values.First(), headerline.Split(";")[i]); - //} string decimalSeparator = Thread.CurrentThread.CurrentCulture.NumberFormat.NumberDecimalSeparator; Assert.AreEqual("DE12345;0" + decimalSeparator + "87;2019-01-01T00:00:00Z;2019-03-01T00:00:00Z;", lines[1]); var commaResult = cr.ToCsv(',', lineTerminator: Environment.NewLine, reihenfolge: reihenfolge); @@ -58,34 +55,34 @@ public void TestCompletenessReportToCsv() var dpunktResult = cr.ToCsv(':', lineTerminator: Environment.NewLine, reihenfolge: reihenfolge); Assert.AreEqual("DE12345:0" + decimalSeparator + "87:\"2019-01-01T00:00:00Z\":\"2019-03-01T00:00:00Z\":", dpunktResult.Split(Environment.NewLine)[1]); - cr.values = new List + cr.Values = new List { new CompletenessReport.BasicVerbrauch() { - wert = 17, - startdatum = new DateTime(2019,1,1,0,0,0, DateTimeKind.Utc), - enddatum = new DateTime(2019,1,2,0,0,0, DateTimeKind.Utc) + Wert = 17, + Startdatum = new DateTime(2019,1,1,0,0,0, DateTimeKind.Utc), + Enddatum = new DateTime(2019,1,2,0,0,0, DateTimeKind.Utc) }, new CompletenessReport.BasicVerbrauch() { - wert = 21, - startdatum = new DateTime(2019,1,7,0,0,0, DateTimeKind.Utc), - enddatum = new DateTime(2019,1,8,0,0,0, DateTimeKind.Utc) + Wert = 21, + Startdatum = new DateTime(2019,1,7,0,0,0, DateTimeKind.Utc), + Enddatum = new DateTime(2019,1,8,0,0,0, DateTimeKind.Utc) }, new CompletenessReport.BasicVerbrauch() { - wert = 35, - startdatum = new DateTime(2019,1,12,0,0,0, DateTimeKind.Utc), - enddatum = new DateTime(2019,1,13,0,0,0, DateTimeKind.Utc) + Wert = 35, + Startdatum = new DateTime(2019,1,12,0,0,0, DateTimeKind.Utc), + Enddatum = new DateTime(2019,1,13,0,0,0, DateTimeKind.Utc) } }; - reihenfolge.Add(new Dictionary() { ["wert"] = "V.wert" }); - reihenfolge.Add(new Dictionary() { ["startdatum"] = "V.startdatum" }); - reihenfolge.Add(new Dictionary() { ["enddatum"] = "V.enddatum" }); + reihenfolge.Add(new Dictionary() { ["Wert"] = "V.wert" }); + reihenfolge.Add(new Dictionary() { ["Startdatum"] = "V.startdatum" }); + reihenfolge.Add(new Dictionary() { ["Enddatum"] = "V.enddatum" }); var multiplicityResult = cr.ToCsv(lineTerminator: Environment.NewLine, reihenfolge: reihenfolge); - Assert.AreEqual(2 + cr.values.Count, new List(multiplicityResult.Split(Environment.NewLine)).Count); + Assert.AreEqual(2 + cr.Values.Count, new List(multiplicityResult.Split(Environment.NewLine)).Count); } [TestMethod] public void TestDeserialisationCompletenessReportColumnsToCsv() @@ -123,7 +120,7 @@ public void TestPrivateFieldsAndUserProperties() counter++; } Assert.IsTrue(lastCsvText.Length > 0); - Assert.IsFalse(lastCsvText.Contains(BO4E.BO.BusinessObject.userPropertiesName)); + Assert.IsFalse(lastCsvText.Contains(BO4E.BO.BusinessObject.USER_PROPERTIES_NAME)); Assert.IsFalse(lastCsvText.Contains("_errorMessage")); } @@ -132,59 +129,59 @@ public void TestCompletenessReportMitGapToCsv() { CompletenessReport cr = new CompletenessReport() { - lokationsId = "DE12345", - coverage = 0.87M, // 87% + LokationsId = "DE12345", + Coverage = 0.87M, // 87% wertermittlungsverfahren = BO4E.ENUM.Wertermittlungsverfahren.PROGNOSE, - referenceTimeFrame = new BO4E.COM.Zeitraum() + ReferenceTimeFrame = new BO4E.COM.Zeitraum() { - startdatum = new DateTime(2019, 1, 1, 0, 0, 0, DateTimeKind.Utc), - enddatum = new DateTime(2019, 3, 1, 0, 0, 0, DateTimeKind.Utc) + Startdatum = new DateTime(2019, 1, 1, 0, 0, 0, DateTimeKind.Utc), + Enddatum = new DateTime(2019, 3, 1, 0, 0, 0, DateTimeKind.Utc) }, }; - cr.values = new List + cr.Values = new List { new CompletenessReport.BasicVerbrauch() { - wert = 17, - startdatum = new DateTime(2019,1,1,0,0,0, DateTimeKind.Utc), - enddatum = new DateTime(2019,1,2,0,0,0, DateTimeKind.Utc) + Wert = 17, + Startdatum = new DateTime(2019,1,1,0,0,0, DateTimeKind.Utc), + Enddatum = new DateTime(2019,1,2,0,0,0, DateTimeKind.Utc) }, new CompletenessReport.BasicVerbrauch() { - wert = 21, - startdatum = new DateTime(2019,1,7,0,0,0, DateTimeKind.Utc), - enddatum = new DateTime(2019,1,8,0,0,0, DateTimeKind.Utc) + Wert = 21, + Startdatum = new DateTime(2019,1,7,0,0,0, DateTimeKind.Utc), + Enddatum = new DateTime(2019,1,8,0,0,0, DateTimeKind.Utc) }, new CompletenessReport.BasicVerbrauch() { - wert = 35, - startdatum = new DateTime(2019,1,12,0,0,0, DateTimeKind.Utc), - enddatum = new DateTime(2019,1,13,0,0,0, DateTimeKind.Utc) + Wert = 35, + Startdatum = new DateTime(2019,1,12,0,0,0, DateTimeKind.Utc), + Enddatum = new DateTime(2019,1,13,0,0,0, DateTimeKind.Utc) } }; - cr.gaps = new List + cr.Gaps = new List { new CompletenessReport.BasicVerbrauch() { - wert = 0, - startdatum = new DateTime(2017,1,1,0,0,0, DateTimeKind.Utc), - enddatum = new DateTime(2017,1,2,0,0,0, DateTimeKind.Utc) + Wert = 0, + Startdatum = new DateTime(2017,1,1,0,0,0, DateTimeKind.Utc), + Enddatum = new DateTime(2017,1,2,0,0,0, DateTimeKind.Utc) }, new CompletenessReport.BasicVerbrauch() { - wert = 0, - startdatum = new DateTime(2017,1,7,0,0,0, DateTimeKind.Utc), - enddatum = new DateTime(2017,1,8,0,0,0, DateTimeKind.Utc) + Wert = 0, + Startdatum = new DateTime(2017,1,7,0,0,0, DateTimeKind.Utc), + Enddatum = new DateTime(2017,1,8,0,0,0, DateTimeKind.Utc) }, new CompletenessReport.BasicVerbrauch() { - wert = 0, - startdatum = new DateTime(2017,1,12,0,0,0, DateTimeKind.Utc), - enddatum = new DateTime(2017,1,13,0,0,0, DateTimeKind.Utc) + Wert = 0, + Startdatum = new DateTime(2017,1,12,0,0,0, DateTimeKind.Utc), + Enddatum = new DateTime(2017,1,13,0,0,0, DateTimeKind.Utc) } }; var multiplicityResult = cr.ToCsv(lineTerminator: Environment.NewLine); - Assert.AreEqual(2 + cr.values.Count + cr.gaps.Count, new List(multiplicityResult.Split(Environment.NewLine)).Count); + Assert.AreEqual(2 + cr.Values.Count + cr.Gaps.Count, new List(multiplicityResult.Split(Environment.NewLine)).Count); } [TestMethod] @@ -192,26 +189,26 @@ public void TestCompletenessReportToCsvExceptions() { CompletenessReport cr = new CompletenessReport() { - lokationsId = "DE12345", - coverage = 0.87M, // 87% + LokationsId = "DE12345", + Coverage = 0.87M, // 87% wertermittlungsverfahren = BO4E.ENUM.Wertermittlungsverfahren.PROGNOSE, - referenceTimeFrame = new BO4E.COM.Zeitraum() + ReferenceTimeFrame = new BO4E.COM.Zeitraum() { - startdatum = new DateTime(2019, 1, 1, 0, 0, 0, DateTimeKind.Utc), - enddatum = new DateTime(2019, 3, 1, 0, 0, 0, DateTimeKind.Utc) + Startdatum = new DateTime(2019, 1, 1, 0, 0, 0, DateTimeKind.Utc), + Enddatum = new DateTime(2019, 3, 1, 0, 0, 0, DateTimeKind.Utc) }, }; // reihenfolge List> reihenfolge = new List> { - new Dictionary() { ["lokationsId"] = "messlokationsId" }, - new Dictionary() { ["coverage"] = "Newcoverage" }, - new Dictionary() { ["Zeitraum.startdatum"] = "time.startdatum" }, - new Dictionary() { ["Zeitraum.enddatum"] = "time.enddatum" }, - new Dictionary() { ["wert"] = null }, - new Dictionary() { ["startdatum"] = "V.startdatum" }, - new Dictionary() { ["enddatum"] = "V.enddatum" }, + new Dictionary() { ["LokationsId"] = "messlokationsId" }, + new Dictionary() { ["Coverage"] = "Newcoverage" }, + new Dictionary() { ["Zeitraum.Startdatum"] = "time.startdatum" }, + new Dictionary() { ["Zeitraum.Enddatum"] = "time.enddatum" }, + new Dictionary() { ["Wert"] = null }, + new Dictionary() { ["Startdatum"] = "V.startdatum" }, + new Dictionary() { ["Enddatum"] = "V.enddatum" }, null }; string newResult = string.Empty; diff --git a/json-schema-files/.gitkeep b/json-schema-files/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/json-schema-files/BO4E.BO.Angebot.json b/json-schema-files/BO4E.BO.Angebot.json new file mode 100644 index 00000000..000f2278 --- /dev/null +++ b/json-schema-files/BO4E.BO.Angebot.json @@ -0,0 +1,2512 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "definitions": { + "Adresse": { + "type": [ + "object", + "null" + ], + "properties": { + "postleitzahl": { + "type": "string" + }, + "ort": { + "type": "string" + }, + "strasse": { + "type": [ + "string", + "null" + ] + }, + "hausnummer": { + "type": [ + "string", + "null" + ] + }, + "postfach": { + "type": [ + "string", + "null" + ] + }, + "adresszusatz": { + "type": [ + "string", + "null" + ] + }, + "coErgaenzung": { + "type": [ + "string", + "null" + ] + }, + "landescode": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "AC", + "AD", + "AE", + "AF", + "AG", + "AI", + "AL", + "AM", + "AN", + "AO", + "AQ", + "AR", + "AS", + "AT", + "AU", + "AW", + "AX", + "AZ", + "BA", + "BB", + "BD", + "BE", + "BF", + "BG", + "BH", + "BI", + "BJ", + "BL", + "BM", + "BN", + "BO", + "BQ", + "BR", + "BS", + "BT", + "BU", + "BV", + "BW", + "BY", + "BZ", + "CA", + "CC", + "CD", + "CF", + "CG", + "CH", + "CI", + "CK", + "CL", + "CM", + "CN", + "CO", + "CP", + "CR", + "CS", + "CU", + "CV", + "CW", + "CX", + "CY", + "CZ", + "DE", + "DG", + "DJ", + "DK", + "DM", + "DO", + "DZ", + "EA", + "EC", + "EE", + "EG", + "EH", + "ER", + "ES", + "ET", + "EU", + "FI", + "FJ", + "FK", + "FM", + "FO", + "FR", + "FX", + "GA", + "GB", + "GD", + "GE", + "GF", + "GG", + "GH", + "GI", + "GL", + "GM", + "GN", + "GP", + "GQ", + "GR", + "GS", + "GT", + "GU", + "GW", + "GY", + "HK", + "HM", + "HN", + "HR", + "HT", + "HU", + "IC", + "ID", + "IE", + "IL", + "IM", + "IN", + "IO", + "IQ", + "IR", + "IS", + "IT", + "JE", + "JM", + "JO", + "JP", + "KE", + "KG", + "KH", + "KI", + "KM", + "KN", + "KP", + "KR", + "KW", + "KY", + "KZ", + "LA", + "LB", + "LC", + "LI", + "LK", + "LR", + "LS", + "LT", + "LU", + "LV", + "LY", + "MA", + "MC", + "MD", + "ME", + "MF", + "MG", + "MH", + "MK", + "ML", + "MM", + "MN", + "MO", + "MP", + "MQ", + "MR", + "MS", + "MT", + "MU", + "MV", + "MW", + "MX", + "MY", + "MZ", + "NA", + "NC", + "NE", + "NF", + "NG", + "NI", + "NL", + "NO", + "NP", + "NR", + "NT", + "NU", + "NZ", + "OM", + "PA", + "PE", + "PF", + "PG", + "PH", + "PK", + "PL", + "PM", + "PN", + "PR", + "PS", + "PT", + "PW", + "PY", + "QA", + "RE", + "RO", + "RS", + "RU", + "RW", + "SA", + "SB", + "SC", + "SD", + "SE", + "SF", + "SG", + "SH", + "SI", + "SJ", + "SK", + "SL", + "SM", + "SN", + "SO", + "SR", + "SS", + "ST", + "SU", + "SV", + "SX", + "SY", + "SZ", + "TA", + "TC", + "TD", + "TF", + "TG", + "TJ", + "TK", + "TL", + "TM", + "TN", + "TO", + "TP", + "TR", + "TT", + "TV", + "TW", + "TZ", + "UA", + "UG", + "UK", + "UM", + "US", + "UY", + "UZ", + "VA", + "VC", + "VE", + "VG", + "VI", + "VN", + "VU", + "WF", + "WS", + "XK", + "YE", + "YT", + "YU", + "ZA", + "ZM", + "ZR", + "ZW" + ] + }, + "guid": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "postleitzahl", + "ort" + ] + }, + "Angebotsposition": { + "type": [ + "object", + "null" + ], + "properties": { + "positionsbezeichung": { + "type": "string" + }, + "positionsmenge": { + "$ref": "#/definitions/Menge" + }, + "positionspreis": { + "$ref": "#/definitions/Preis" + }, + "positionsbetrag": { + "$ref": "#/definitions/Betrag" + }, + "guid": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "positionsbezeichung", + "positionspreis" + ] + }, + "Angebotsteil": { + "type": [ + "object", + "null" + ], + "properties": { + "anfrageSubreferenz": { + "type": [ + "string", + "null" + ] + }, + "lieferstellenangebotsteil": { + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Marktlokation" + } + }, + "gesamtmengeangebotsteil": { + "$ref": "#/definitions/Menge" + }, + "gesamtkostenangebotsteil": { + "$ref": "#/definitions/Betrag" + }, + "positionen": { + "type": "array", + "items": { + "$ref": "#/definitions/Angebotsposition" + } + }, + "guid": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "positionen" + ] + }, + "Angebotsvariante": { + "type": [ + "object", + "null" + ], + "properties": { + "angebotsstatus": { + "type": "string", + "enum": [ + "KONZEPTION", + "UNVERBINDLICH", + "VERBINDLICH", + "BEAUFTRAGT", + "UNGUELTIG", + "ABGELEHNT", + "NACHGEFASST", + "AUSSTEHEND", + "ERLEDIGT" + ] + }, + "beschreibung": { + "type": [ + "string", + "null" + ] + }, + "erstelldatum": { + "type": "string", + "format": "date-time" + }, + "bindefrist": { + "type": "string", + "format": "date-time" + }, + "gesamtmenge": { + "$ref": "#/definitions/Menge" + }, + "gesamtkosten": { + "$ref": "#/definitions/Betrag" + }, + "teile": { + "type": "array", + "items": { + "$ref": "#/definitions/Angebotsteil" + } + }, + "guid": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "angebotsstatus", + "bindefrist", + "teile" + ] + }, + "Ansprechpartner": { + "type": [ + "object", + "null" + ], + "properties": { + "guid": { + "type": [ + "string", + "null" + ] + }, + "boTyp": { + "type": [ + "string", + "null" + ] + }, + "versionStruktur": { + "type": "integer" + }, + "anrede": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "HERR", + "FRAU", + "EHELEUTE", + "FIRMA", + "INDIVIDUELL", + "DR" + ] + }, + "individuelleAnrede": { + "type": [ + "string", + "null" + ] + }, + "titel": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "DR", + "PROF", + "PROF_DR" + ] + }, + "vorname": { + "type": [ + "string", + "null" + ] + }, + "nachname": { + "type": "string" + }, + "eMailAdresse": { + "type": [ + "string", + "null" + ] + }, + "kommentar": { + "type": [ + "string", + "null" + ] + }, + "geschaeftspartner": { + "$ref": "#/definitions/Geschaeftspartner" + }, + "adresse": { + "$ref": "#/definitions/Adresse" + }, + "rufnummer": { + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Rufnummer" + } + }, + "zustaendigkeit": { + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Zustaendigkeit" + } + } + }, + "required": [ + "nachname", + "geschaeftspartner" + ] + }, + "Betrag": { + "type": [ + "object", + "null" + ], + "properties": { + "wert": { + "type": "number" + }, + "waehrung": { + "type": "string", + "enum": [ + "AFN", + "ALL", + "AMD", + "ANG", + "AOA", + "ARS", + "AUD", + "AWG", + "AZN", + "BAM", + "BBD", + "BDT", + "BGN", + "BHD", + "BIF", + "BMD", + "BND", + "BOB", + "BOV", + "BRL", + "BSD", + "BTN", + "BWP", + "BYN", + "BYR", + "BZD", + "CAD", + "CDF", + "CHE", + "CHF", + "CHW", + "CLF", + "CLP", + "CNY", + "COP", + "COU", + "CRC", + "CUC", + "CUP", + "CVE", + "CZK", + "DJF", + "DKK", + "DOP", + "DZD", + "EGP", + "ERN", + "ETB", + "EUR", + "FJD", + "FKP", + "GBP", + "GEL", + "GHS", + "GIP", + "GMD", + "GNF", + "GTQ", + "GYD", + "HKD", + "HNL", + "HRK", + "HTG", + "HUF", + "IDR", + "ILS", + "INR", + "IQD", + "IRR", + "ISK", + "JMD", + "JOD", + "JPY", + "KES", + "KGS", + "KHR", + "KMF", + "KPW", + "KRW", + "KWD", + "KYD", + "KZT", + "LAK", + "LBP", + "LKR", + "LRD", + "LSL", + "LTL", + "LYD", + "MAD", + "MDL", + "MGA", + "MKD", + "MMK", + "MNT", + "MOP", + "MRO", + "MUR", + "MVR", + "MWK", + "MXN", + "MXV", + "MYR", + "MZN", + "NAD", + "NGN", + "NIO", + "NOK", + "NPR", + "NZD", + "OMR", + "PAB", + "PEN", + "PGK", + "PHP", + "PKR", + "PLN", + "PYG", + "QAR", + "RON", + "RSD", + "RUB", + "RUR", + "RWF", + "SAR", + "SBD", + "SCR", + "SDG", + "SEK", + "SGD", + "SHP", + "SLL", + "SOS", + "SRD", + "SSP", + "STD", + "SVC", + "SYP", + "SZL", + "THB", + "TJS", + "TMT", + "TND", + "TOP", + "TRY", + "TTD", + "TWD", + "TZS", + "UAH", + "UGX", + "USD", + "USN", + "USS", + "UYI", + "UYU", + "UZS", + "VEF", + "VND", + "VUV", + "WST", + "XAF", + "XAG", + "XAU", + "XBA", + "XBB", + "XBC", + "XBD", + "XCD", + "XDR", + "XOF", + "XPD", + "XPF", + "XPT", + "XSU", + "XTS", + "XUA", + "XXX", + "YER", + "ZAR", + "ZMW", + "ZWL" + ] + }, + "guid": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "wert", + "waehrung" + ] + }, + "Dienstleistung": { + "type": [ + "object", + "null" + ], + "properties": { + "dienstleistungstyp": { + "type": "string", + "enum": [ + "DATENBEREITSTELLUNG_TAEGLICH", + "DATENBEREITSTELLUNG_WOECHENTLICH", + "DATENBEREITSTELLUNG_MONATLICH", + "DATENBEREITSTELLUNG_JAEHRLICH", + "DATENBEREITSTELLUNG_HISTORISCHE_LG", + "DATENBEREITSTELLUNG_STUENDLICH", + "DATENBEREITSTELLUNG_VIERTELJAEHRLICH", + "DATENBEREITSTELLUNG_HALBJAEHRLICH", + "DATENBEREITSTELLUNG_MONATLICH_ZUSAETZLICH", + "DATENBEREITSTELLUNG_EINMALIG", + "AUSLESUNG_2X_TAEGLICH_FERNAUSLESUNG", + "AUSLESUNG_TAEGLICH_FERNAUSLESUNG", + "AUSLESUNG_LGK_MANUELL_MSB", + "AUSLESUNG_MONATLICH_SLP_FERNAUSLESUNG", + "AUSLESUNG_JAEHRLICH_SLP_FERNAUSLESUNG", + "AUSLESUNG_MDE_SLP", + "ABLESUNG_MONATLICH_SLP", + "ABLESUNG_VIERTELJAEHRLICH_SLP", + "ABLESUNG_HALBJAEHRLICH_SLP", + "ABLESUNG_JAEHRLICH_SLP", + "AUSLESUNG_SLP_FERNAUSLESUNG", + "ABLESUNG_SLP_ZUSAETZLICH_MSB", + "ABLESUNG_SLP_ZUSAETZLICH_KUNDE", + "AUSLESUNG_LGK_FERNAUSLESUNG_ZUSAETZLICH_MSB", + "AUSLESUNG_MOATLICH_FERNAUSLESUNG", + "AUSLESUNG_STUENDLICH_FERNAUSLESUNG", + "ABLESUNG_MONATLICH_LGK", + "AUSLESUNG_TEMERATURMENGENUMWERTER", + "AUSLESUNG_ZUSTANDSMENGENUMWERTER", + "AUSLESUNG_SYSTEMMENGENUMWERTER", + "AUSLESUNG_VORGANG_SLP", + "AUSLESUUNG_KOMPAKTMENGENUMWERTER", + "AUSLESUNG_MDE_LGK", + "SPERRUNG_SLP", + "ENTSPERRUNG_SLP", + "SPERRUNG_RLM", + "ENTSPERRUNG_RLM", + "MAHNKOSTEN", + "INKASSOKOSTEN" + ] + }, + "bezeichnung": { + "type": "string" + }, + "guid": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "dienstleistungstyp", + "bezeichnung" + ] + }, + "Geokoordinaten": { + "type": [ + "object", + "null" + ], + "properties": { + "breitengrad": { + "type": "number" + }, + "laengengrad": { + "type": "number" + }, + "guid": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "breitengrad", + "laengengrad" + ] + }, + "Geraeteeigenschaften": { + "type": [ + "object", + "null" + ], + "properties": { + "geraetetyp": { + "type": "string", + "enum": [ + "WECHSELSTROMZAEHLER", + "DREHSTROMZAEHLER", + "ZWEIRICHTUNGSZAEHLER", + "RLM_ZAEHLER", + "IMS_ZAEHLER", + "BALGENGASZAEHLER", + "MAXIMUMZAEHLER", + "MULTIPLEXANLAGE", + "PAUSCHALANLAGE", + "VERSTAERKERANLAGE", + "SUMMATIONSGERAET", + "IMPULSGEBER", + "EDL_21_ZAEHLERAUFSATZ", + "VIER_QUADRANTEN_LASTGANGZAEHLER", + "MENGENUMWERTER", + "STROMWANDLER", + "SPANNUNGSWANDLER", + "DATENLOGGER", + "KOMMUNIKATIONSANSCHLUSS", + "MODEM", + "TELEKOMMUNIKATIONSEINRICHTUNG", + "DREHKOLBENGASZAEHLER", + "TURBINENRADGASZAEHLER", + "ULTRASCHALLZAEHLER", + "WIRBELGASZAEHLER", + "MODERNE_MESSEINRICHTUNG", + "ELEKTRONISCHER_HAUSHALTSZAEHLER", + "STEUEREINRICHTUNG", + "TECHNISCHESTEUEREINRICHTUNG", + "TARIFSCHALTGERAET", + "RUNDSTEUEREMPFAENGER", + "OPTIONALE_ZUS_ZAEHLEINRICHTUNG", + "MESSWANDLERSATZ_IMS_MME", + "KOMBIMESSWANDLER_IMS_MME", + "TARIFSCHALTGERAET_IMS_MME", + "RUNDSTEUEREMPFAENGER_IMS_MME", + "TEMPERATUR_KOMPENSATION", + "HOECHSTBELASTUNGS_ANZEIGER", + "SONSTIGES_GERAET", + "SMARTMETERGATEWAY", + "STEUERBOX", + "BLOCKSTROMWANDLER", + "KOMBIMESSWANDLER" + ] + }, + "geraetemerkmal": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "EINTARIF", + "ZWEITARIF", + "MEHRTARIF", + "GAS_G2_5", + "GAS_G4", + "GAS_G6", + "GAS_G10", + "GAS_G16", + "GAS_G25", + "GAS_G40", + "GAS_G65", + "GAS_G100", + "GAS_G160", + "GAS_G250", + "GAS_G400", + "GAS_G650", + "GAS_G1000", + "GAS_G1600", + "GAS_G2500", + "IMPULSGEBER_G4_G100", + "IMPULSGEBER_G100", + "MODEM_GSM", + "MODEM_GPRS", + "MODEM_FUNK", + "MODEM_GSM_O_LG", + "MODEM_GSM_M_LG", + "MODEM_FESTNETZ", + "MODEM_GPRS_M_LG", + "PLC_COM", + "ETHERNET_KOM", + "DSL_KOM", + "LTE_KOM", + "RUNDSTEUEREMPFAENGER", + "TARIFSCHALTGERAET", + "ZUSTANDS_MU", + "TEMPERATUR_MU", + "KOMPAKT_MU", + "SYSTEM_MU" + ] + }, + "parameter": { + "type": [ + "object", + "null" + ], + "additionalProperties": { + "type": [ + "string", + "null" + ] + } + }, + "guid": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "geraetetyp" + ] + }, + "Geschaeftspartner": { + "type": "object", + "properties": { + "guid": { + "type": [ + "string", + "null" + ] + }, + "boTyp": { + "type": [ + "string", + "null" + ] + }, + "versionStruktur": { + "type": "integer" + }, + "anrede": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "HERR", + "FRAU", + "EHELEUTE", + "FIRMA", + "INDIVIDUELL", + "DR" + ] + }, + "title": { + "type": [ + "string", + "null" + ] + }, + "name1": { + "type": [ + "string", + "null" + ] + }, + "name2": { + "type": [ + "string", + "null" + ] + }, + "name3": { + "type": [ + "string", + "null" + ] + }, + "gewerbekennzeichnung": { + "type": "boolean" + }, + "hrnummer": { + "type": [ + "string", + "null" + ] + }, + "amtsgericht": { + "type": [ + "string", + "null" + ] + }, + "kontaktweg": { + "type": [ + "array", + "null" + ], + "items": { + "type": "string", + "enum": [ + "ANSCHREIBEN", + "TELEFONAT", + "FAX", + "E_MAIL", + "SMS" + ] + } + }, + "umsatzsteuerId": { + "type": [ + "string", + "null" + ] + }, + "glaeubigerId": { + "type": [ + "string", + "null" + ] + }, + "eMailAdresse": { + "type": [ + "string", + "null" + ] + }, + "website": { + "type": [ + "string", + "null" + ] + }, + "geschaeftspartnerrolle": { + "type": [ + "array", + "null" + ], + "items": { + "type": "string", + "enum": [ + "LIEFERANT", + "DIENSTLEISTER", + "KUNDE", + "INTERESSENT", + "MARKTPARTNER" + ] + } + }, + "partneradresse": { + "$ref": "#/definitions/Adresse" + } + }, + "required": [ + "gewerbekennzeichnung" + ] + }, + "Geschaeftspartner-1": { + "type": [ + "object", + "null" + ], + "properties": { + "guid": { + "type": [ + "string", + "null" + ] + }, + "boTyp": { + "type": [ + "string", + "null" + ] + }, + "versionStruktur": { + "type": "integer" + }, + "anrede": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "HERR", + "FRAU", + "EHELEUTE", + "FIRMA", + "INDIVIDUELL", + "DR" + ] + }, + "title": { + "type": [ + "string", + "null" + ] + }, + "name1": { + "type": [ + "string", + "null" + ] + }, + "name2": { + "type": [ + "string", + "null" + ] + }, + "name3": { + "type": [ + "string", + "null" + ] + }, + "gewerbekennzeichnung": { + "type": "boolean" + }, + "hrnummer": { + "type": [ + "string", + "null" + ] + }, + "amtsgericht": { + "type": [ + "string", + "null" + ] + }, + "kontaktweg": { + "type": [ + "array", + "null" + ], + "items": { + "type": "string", + "enum": [ + "ANSCHREIBEN", + "TELEFONAT", + "FAX", + "E_MAIL", + "SMS" + ] + } + }, + "umsatzsteuerId": { + "type": [ + "string", + "null" + ] + }, + "glaeubigerId": { + "type": [ + "string", + "null" + ] + }, + "eMailAdresse": { + "type": [ + "string", + "null" + ] + }, + "website": { + "type": [ + "string", + "null" + ] + }, + "geschaeftspartnerrolle": { + "type": [ + "array", + "null" + ], + "items": { + "type": "string", + "enum": [ + "LIEFERANT", + "DIENSTLEISTER", + "KUNDE", + "INTERESSENT", + "MARKTPARTNER" + ] + } + }, + "partneradresse": { + "$ref": "#/definitions/Adresse" + } + }, + "required": [ + "gewerbekennzeichnung" + ] + }, + "Hardware": { + "type": [ + "object", + "null" + ], + "properties": { + "geraetetyp": { + "type": "string", + "enum": [ + "WECHSELSTROMZAEHLER", + "DREHSTROMZAEHLER", + "ZWEIRICHTUNGSZAEHLER", + "RLM_ZAEHLER", + "IMS_ZAEHLER", + "BALGENGASZAEHLER", + "MAXIMUMZAEHLER", + "MULTIPLEXANLAGE", + "PAUSCHALANLAGE", + "VERSTAERKERANLAGE", + "SUMMATIONSGERAET", + "IMPULSGEBER", + "EDL_21_ZAEHLERAUFSATZ", + "VIER_QUADRANTEN_LASTGANGZAEHLER", + "MENGENUMWERTER", + "STROMWANDLER", + "SPANNUNGSWANDLER", + "DATENLOGGER", + "KOMMUNIKATIONSANSCHLUSS", + "MODEM", + "TELEKOMMUNIKATIONSEINRICHTUNG", + "DREHKOLBENGASZAEHLER", + "TURBINENRADGASZAEHLER", + "ULTRASCHALLZAEHLER", + "WIRBELGASZAEHLER", + "MODERNE_MESSEINRICHTUNG", + "ELEKTRONISCHER_HAUSHALTSZAEHLER", + "STEUEREINRICHTUNG", + "TECHNISCHESTEUEREINRICHTUNG", + "TARIFSCHALTGERAET", + "RUNDSTEUEREMPFAENGER", + "OPTIONALE_ZUS_ZAEHLEINRICHTUNG", + "MESSWANDLERSATZ_IMS_MME", + "KOMBIMESSWANDLER_IMS_MME", + "TARIFSCHALTGERAET_IMS_MME", + "RUNDSTEUEREMPFAENGER_IMS_MME", + "TEMPERATUR_KOMPENSATION", + "HOECHSTBELASTUNGS_ANZEIGER", + "SONSTIGES_GERAET", + "SMARTMETERGATEWAY", + "STEUERBOX", + "BLOCKSTROMWANDLER", + "KOMBIMESSWANDLER" + ] + }, + "bezeichnung": { + "type": "string" + }, + "geraeteeigenschaften": { + "$ref": "#/definitions/Geraeteeigenschaften" + }, + "geraetenummer": { + "type": [ + "string", + "null" + ] + }, + "geraetereferenz": { + "type": [ + "string", + "null" + ] + }, + "guid": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "geraetetyp", + "bezeichnung" + ] + }, + "Katasteradresse": { + "type": [ + "object", + "null" + ], + "properties": { + "gemarkung_flur": { + "type": "string" + }, + "flurstueck": { + "type": "string" + }, + "guid": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "gemarkung_flur", + "flurstueck" + ] + }, + "Konzessionsabgabe": { + "type": [ + "object", + "null" + ], + "properties": { + "guid": { + "type": [ + "string", + "null" + ] + }, + "kosten": { + "type": "number" + }, + "kategorie": { + "type": "string" + }, + "satz": { + "type": "string", + "enum": [ + "KAS", + "SA", + "SAS", + "TA", + "TAS", + "TK", + "TKS", + "TS", + "TSS" + ] + } + }, + "required": [ + "kosten", + "kategorie", + "satz" + ] + }, + "Marktlokation": { + "type": [ + "object", + "null" + ], + "properties": { + "guid": { + "type": [ + "string", + "null" + ] + }, + "boTyp": { + "type": [ + "string", + "null" + ] + }, + "versionStruktur": { + "type": "integer" + }, + "marktlokationsId": { + "type": "string", + "default": "|null|" + }, + "sparte": { + "type": "string", + "enum": [ + "STROM", + "GAS", + "FERNWAERME", + "NAHWAERME", + "WASSER", + "ABWASSER" + ] + }, + "energierichtung": { + "type": "string", + "enum": [ + "AUSSP", + "EINSP" + ] + }, + "bilanzierungsmethode": { + "type": "string", + "enum": [ + "RLM", + "SLP", + "TLP_GEMEINSAM", + "TLP_GETRENNT", + "PAUSCHAL", + "IMS" + ] + }, + "verbrauchsart": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "KL", + "KLW", + "KLWS", + "W", + "WS" + ] + }, + "unterbrechbar": { + "type": [ + "boolean", + "null" + ] + }, + "netzebene": { + "type": "string", + "enum": [ + "NSP", + "MSP", + "HSP", + "HSS", + "MSP_NSP_UMSP", + "HSP_MSP_UMSP", + "HSS_HSP_UMSP", + "HD", + "MD", + "ND" + ] + }, + "netzbetreiberCodeNr": { + "type": [ + "string", + "null" + ] + }, + "gebietTyp": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "REGELZONE", + "MARKTGEBIET", + "BILANZIERUNGSGEBIET", + "VERTEILNETZ", + "TRANSPORTNETZ", + "REGIONALNETZ", + "AREALNETZ", + "GRUNDVERSORGUNGSGEBIET", + "VERSORGUNGSGEBIET" + ] + }, + "netzgebietNr": { + "type": [ + "string", + "null" + ] + }, + "bilanzierungsgebiet": { + "type": [ + "string", + "null" + ] + }, + "grundversorgerCodeNr": { + "type": [ + "string", + "null" + ] + }, + "gasqualitaet": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "H_GAS", + "H_GAS", + "L_GAS", + "L_GAS" + ] + }, + "endkunde": { + "$ref": "#/definitions/Geschaeftspartner-1" + }, + "lokationsadresse": { + "$ref": "#/definitions/Adresse" + }, + "geoadresse": { + "$ref": "#/definitions/Geokoordinaten" + }, + "katasterinformation": { + "$ref": "#/definitions/Katasteradresse" + }, + "marktrollen": { + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Marktrolle" + } + }, + "regelzone": { + "type": [ + "string", + "null" + ] + }, + "marktgebiet": { + "type": [ + "string", + "null" + ] + }, + "zeitreihentyp": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "EGS", + "LGS", + "NZR", + "SES", + "SLS", + "TES", + "TLS" + ] + }, + "zaehlwerke": { + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Zaehlwerk" + } + }, + "verbauchsmenge": { + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Verbrauch" + } + }, + "messlokationen": { + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Messlokation" + } + }, + "zugehoerigeMesslokationen": { + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Messlokationszuordnung" + } + } + }, + "required": [ + "marktlokationsId", + "sparte", + "energierichtung", + "bilanzierungsmethode", + "netzebene" + ] + }, + "Marktrolle": { + "type": [ + "object", + "null" + ], + "properties": { + "rollencodenummer": { + "type": [ + "string", + "null" + ] + }, + "code": { + "type": [ + "string", + "null" + ] + }, + "marktrolle": { + "type": "string", + "enum": [ + "NB", + "LF", + "MSB", + "MDL", + "DL", + "BKV", + "BIKO", + "UENB", + "KUNDE_SELBST_NN", + "MGV", + "EIV", + "RB", + "KUNDE", + "INTERESSENT" + ] + }, + "guid": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "marktrolle" + ] + }, + "Menge": { + "type": [ + "object", + "null" + ], + "properties": { + "wert": { + "type": "number" + }, + "einheit": { + "type": "string", + "enum": [ + "WH", + "KW", + "ANZAHL", + "KUBIKMETER", + "STUNDE", + "TAG", + "MONAT", + "VAR", + "VARH", + "JAHR", + "KWH", + "MW", + "KVAR", + "KVARH", + "MWH" + ] + }, + "guid": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "wert", + "einheit" + ] + }, + "Messlokation": { + "type": [ + "object", + "null" + ], + "properties": { + "guid": { + "type": [ + "string", + "null" + ] + }, + "boTyp": { + "type": [ + "string", + "null" + ] + }, + "versionStruktur": { + "type": "integer" + }, + "messLokationsId": { + "type": "string", + "default": "|null|" + }, + "sparte": { + "type": "string", + "enum": [ + "STROM", + "GAS", + "FERNWAERME", + "NAHWAERME", + "WASSER", + "ABWASSER" + ] + }, + "netzebeneMessung": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "NSP", + "MSP", + "HSP", + "HSS", + "MSP_NSP_UMSP", + "HSP_MSP_UMSP", + "HSS_HSP_UMSP", + "HD", + "MD", + "ND" + ] + }, + "messgebietNr": { + "type": [ + "string", + "null" + ] + }, + "grundzustaendigerMSBCodeNr": { + "type": [ + "string", + "null" + ] + }, + "grundzustaendigerMSBIMCodeNr": { + "type": [ + "string", + "null" + ] + }, + "grundzustaendigerMDLodeNr": { + "type": [ + "string", + "null" + ] + }, + "messadresse": { + "$ref": "#/definitions/Adresse" + }, + "geoadresse": { + "$ref": "#/definitions/Geokoordinaten" + }, + "katasterinformation": { + "$ref": "#/definitions/Katasteradresse" + }, + "geraete": { + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Hardware" + } + }, + "messdienstleistung": { + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Dienstleistung" + } + }, + "messlokationszaehler": { + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Zaehler" + } + }, + "bilanzierungsmethode": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "RLM", + "SLP", + "TLP_GEMEINSAM", + "TLP_GETRENNT", + "PAUSCHAL", + "IMS" + ] + }, + "abrechnungmessstellenbetriebnna": { + "type": [ + "boolean", + "null" + ] + }, + "marktrollen": { + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Marktrolle" + } + }, + "gasqualitaet": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "H_GAS", + "H_GAS", + "L_GAS", + "L_GAS" + ] + }, + "verlustfaktor": { + "type": [ + "number", + "null" + ] + } + }, + "required": [ + "messLokationsId", + "sparte" + ] + }, + "Messlokationszuordnung": { + "type": [ + "object", + "null" + ], + "properties": { + "messlokationsId": { + "type": "string" + }, + "arithmetik": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "ADDITION", + "SUBTRAKTION", + "MULTIPLIKATION", + "DIVISION" + ] + }, + "gueltigSeit": { + "type": [ + "string", + "null" + ], + "format": "date-time" + }, + "gueltigBis": { + "type": [ + "string", + "null" + ], + "format": "date-time" + }, + "guid": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "messlokationsId" + ] + }, + "Preis": { + "type": "object", + "properties": { + "wert": { + "type": "number" + }, + "einheit": { + "type": "string", + "enum": [ + "EUR", + "CT" + ] + }, + "bezugswert": { + "type": "string", + "enum": [ + "WH", + "KW", + "ANZAHL", + "KUBIKMETER", + "STUNDE", + "TAG", + "MONAT", + "VAR", + "VARH", + "JAHR", + "KWH", + "MW", + "KVAR", + "KVARH", + "MWH" + ] + }, + "status": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "VORLAEUFIG", + "ENDGUELTIG" + ] + }, + "guid": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "wert", + "einheit", + "bezugswert" + ] + }, + "Rufnummer": { + "type": [ + "object", + "null" + ], + "properties": { + "nummerntyp": { + "type": "string", + "enum": [ + "RUF_ZENTRALE", + "FAX_ZENTRALE", + "SAMMELRUF", + "SAMMELFAX", + "ABTEILUNGRUF", + "ABTEILUNGFAX", + "RUF_DURCHWAHL", + "FAX_DURCHWAHL", + "MOBIL_NUMMER" + ] + }, + "rufnummer": { + "type": "string" + }, + "guid": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "nummerntyp", + "rufnummer" + ] + }, + "Verbrauch": { + "type": [ + "object", + "null" + ], + "properties": { + "type": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "ARBEITLEISTUNGTAGESPARAMETERABHMALO", + "VERANSCHLAGTEJAHRESMENGE", + "TUMKUNDENWERT" + ] + }, + "guid": { + "type": [ + "string", + "null" + ] + }, + "wertermittlungsverfahren": { + "type": "string", + "enum": [ + "PROGNOSE", + "MESSUNG" + ] + }, + "obiskennzahl": { + "type": "string" + }, + "startdatum": { + "type": "string", + "format": "date-time" + }, + "wert": { + "type": "number" + }, + "enddatum": { + "type": "string", + "format": "date-time" + }, + "einheit": { + "type": "string", + "enum": [ + "WH", + "KW", + "ANZAHL", + "KUBIKMETER", + "STUNDE", + "TAG", + "MONAT", + "VAR", + "VARH", + "JAHR", + "KWH", + "MW", + "KVAR", + "KVARH", + "MWH" + ] + } + }, + "required": [ + "wertermittlungsverfahren", + "obiskennzahl", + "wert", + "einheit" + ] + }, + "Zaehler": { + "type": [ + "object", + "null" + ], + "properties": { + "guid": { + "type": [ + "string", + "null" + ] + }, + "boTyp": { + "type": [ + "string", + "null" + ] + }, + "versionStruktur": { + "type": "integer" + }, + "zaehlernummer": { + "type": "string" + }, + "sparte": { + "type": "string", + "enum": [ + "STROM", + "GAS", + "FERNWAERME", + "NAHWAERME", + "WASSER", + "ABWASSER" + ] + }, + "zaehlerauspraegung": { + "type": "string", + "enum": [ + "EINRICHTUNGSZAEHLER", + "ZWEIRICHTUNGSZAEHLER" + ] + }, + "zaehlertyp": { + "type": "string", + "enum": [ + "DREHSTROMZAEHLER", + "BALGENGASZAEHLER", + "DREHKOLBENZAEHLER", + "SMARTMETER", + "LEISTUNGSZAEHLER", + "MAXIMUMZAEHLER", + "TURBINENRADGASZAEHLER", + "ULTRASCHALLGASZAEHLER", + "WECHSELSTROMZAEHLER" + ] + }, + "tarifart": { + "type": "string", + "enum": [ + "EINTARIF", + "ZWEITARIF", + "MEHRTARIF", + "SMART_METER", + "LEISTUNGSGEMESSEN" + ] + }, + "zaehlerkonstante": { + "type": "number" + }, + "eichungBis": { + "type": [ + "string", + "null" + ], + "format": "date-time" + }, + "letzteEichung": { + "type": [ + "string", + "null" + ], + "format": "date-time" + }, + "zaehlwerke": { + "type": "array", + "items": { + "$ref": "#/definitions/Zaehlwerk" + }, + "minItems": 1 + }, + "zaehlerhersteller": { + "$ref": "#/definitions/Geschaeftspartner-1" + }, + "gateway": { + "type": [ + "string", + "null" + ] + }, + "fernschaltung": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "VORHANDEN", + "NICHT_VORHANDEN" + ] + }, + "messwerterfassung": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "FERNAUSLESBAR", + "MANUELL_AUSGELESENE" + ] + } + }, + "required": [ + "zaehlernummer", + "sparte", + "zaehlerauspraegung", + "zaehlertyp", + "tarifart", + "zaehlwerke" + ] + }, + "Zaehlwerk": { + "type": [ + "object", + "null" + ], + "properties": { + "zaehlwerkId": { + "type": "string" + }, + "bezeichnung": { + "type": "string" + }, + "richtung": { + "type": "string", + "enum": [ + "AUSSP", + "EINSP" + ] + }, + "obisKennzahl": { + "type": "string" + }, + "wandlerfaktor": { + "type": "number" + }, + "einheit": { + "type": "string", + "enum": [ + "WH", + "KW", + "ANZAHL", + "KUBIKMETER", + "STUNDE", + "TAG", + "MONAT", + "VAR", + "VARH", + "JAHR", + "KWH", + "MW", + "KVAR", + "KVARH", + "MWH" + ] + }, + "kennzahl": { + "type": [ + "string", + "null" + ] + }, + "schwachlastfaehig": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "NICHT_SCHWACHLASTFAEHIG", + "SCHWACHLASTFAEHIG" + ] + }, + "verwendungszwecke": { + "type": [ + "array", + "null" + ], + "items": { + "type": "string", + "enum": [ + "NETZNUTZUNGSABRECHNUNG", + "BILANZKREISABRECHNUNG", + "MEHRMINDERMBENGENABRECHNUNG", + "ENDKUNDENABRECHNUNG" + ] + } + }, + "verbrauchsart": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "KL", + "KLW", + "KLWS", + "W", + "WS" + ] + }, + "unterbrechbarkeit": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "UV", + "NUV" + ] + }, + "waermenutzung": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "SPEICHERHEIZUNG", + "WAERMEPUMPE", + "DIREKTHEIZUNG" + ] + }, + "konzessionsabgabe": { + "$ref": "#/definitions/Konzessionsabgabe" + }, + "steuerbefreit": { + "type": [ + "boolean", + "null" + ] + }, + "vorkommastelle": { + "type": [ + "integer", + "null" + ] + }, + "nachkommastelle": { + "type": [ + "integer", + "null" + ] + }, + "guid": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "zaehlwerkId", + "bezeichnung", + "richtung", + "obisKennzahl", + "wandlerfaktor", + "einheit" + ] + }, + "Zustaendigkeit": { + "type": [ + "object", + "null" + ], + "properties": { + "jobtitel": { + "type": [ + "string", + "null" + ] + }, + "abteilung": { + "type": [ + "string", + "null" + ] + }, + "themengebiet": { + "type": [ + "string", + "null" + ] + }, + "guid": { + "type": [ + "string", + "null" + ] + } + } + } + }, + "type": "object", + "properties": { + "guid": { + "type": [ + "string", + "null" + ] + }, + "boTyp": { + "type": [ + "string", + "null" + ] + }, + "versionStruktur": { + "type": "integer" + }, + "angebotsnummer": { + "type": "string" + }, + "anfragereferenz": { + "type": [ + "string", + "null" + ] + }, + "angebotsdatum": { + "type": "string" + }, + "sparte": { + "type": "string", + "enum": [ + "STROM", + "GAS", + "FERNWAERME", + "NAHWAERME", + "WASSER", + "ABWASSER" + ] + }, + "bindefrist": { + "type": "string", + "format": "date-time" + }, + "angebotgeber": { + "$ref": "#/definitions/Geschaeftspartner" + }, + "angebotnehmer": { + "$ref": "#/definitions/Geschaeftspartner" + }, + "unterzeichnerAngebotsnehmer": { + "$ref": "#/definitions/Ansprechpartner" + }, + "unterzeichnerAngebotsgeber": { + "$ref": "#/definitions/Ansprechpartner" + }, + "varianten": { + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Angebotsvariante" + }, + "minItems": 1 + } + }, + "required": [ + "angebotsnummer", + "angebotsdatum", + "sparte", + "angebotgeber", + "angebotnehmer" + ] +} \ No newline at end of file diff --git a/json-schema-files/BO4E.BO.Ansprechpartner.json b/json-schema-files/BO4E.BO.Ansprechpartner.json new file mode 100644 index 00000000..8e967ff1 --- /dev/null +++ b/json-schema-files/BO4E.BO.Ansprechpartner.json @@ -0,0 +1,638 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "definitions": { + "Adresse": { + "type": [ + "object", + "null" + ], + "properties": { + "postleitzahl": { + "type": "string" + }, + "ort": { + "type": "string" + }, + "strasse": { + "type": [ + "string", + "null" + ] + }, + "hausnummer": { + "type": [ + "string", + "null" + ] + }, + "postfach": { + "type": [ + "string", + "null" + ] + }, + "adresszusatz": { + "type": [ + "string", + "null" + ] + }, + "coErgaenzung": { + "type": [ + "string", + "null" + ] + }, + "landescode": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "AC", + "AD", + "AE", + "AF", + "AG", + "AI", + "AL", + "AM", + "AN", + "AO", + "AQ", + "AR", + "AS", + "AT", + "AU", + "AW", + "AX", + "AZ", + "BA", + "BB", + "BD", + "BE", + "BF", + "BG", + "BH", + "BI", + "BJ", + "BL", + "BM", + "BN", + "BO", + "BQ", + "BR", + "BS", + "BT", + "BU", + "BV", + "BW", + "BY", + "BZ", + "CA", + "CC", + "CD", + "CF", + "CG", + "CH", + "CI", + "CK", + "CL", + "CM", + "CN", + "CO", + "CP", + "CR", + "CS", + "CU", + "CV", + "CW", + "CX", + "CY", + "CZ", + "DE", + "DG", + "DJ", + "DK", + "DM", + "DO", + "DZ", + "EA", + "EC", + "EE", + "EG", + "EH", + "ER", + "ES", + "ET", + "EU", + "FI", + "FJ", + "FK", + "FM", + "FO", + "FR", + "FX", + "GA", + "GB", + "GD", + "GE", + "GF", + "GG", + "GH", + "GI", + "GL", + "GM", + "GN", + "GP", + "GQ", + "GR", + "GS", + "GT", + "GU", + "GW", + "GY", + "HK", + "HM", + "HN", + "HR", + "HT", + "HU", + "IC", + "ID", + "IE", + "IL", + "IM", + "IN", + "IO", + "IQ", + "IR", + "IS", + "IT", + "JE", + "JM", + "JO", + "JP", + "KE", + "KG", + "KH", + "KI", + "KM", + "KN", + "KP", + "KR", + "KW", + "KY", + "KZ", + "LA", + "LB", + "LC", + "LI", + "LK", + "LR", + "LS", + "LT", + "LU", + "LV", + "LY", + "MA", + "MC", + "MD", + "ME", + "MF", + "MG", + "MH", + "MK", + "ML", + "MM", + "MN", + "MO", + "MP", + "MQ", + "MR", + "MS", + "MT", + "MU", + "MV", + "MW", + "MX", + "MY", + "MZ", + "NA", + "NC", + "NE", + "NF", + "NG", + "NI", + "NL", + "NO", + "NP", + "NR", + "NT", + "NU", + "NZ", + "OM", + "PA", + "PE", + "PF", + "PG", + "PH", + "PK", + "PL", + "PM", + "PN", + "PR", + "PS", + "PT", + "PW", + "PY", + "QA", + "RE", + "RO", + "RS", + "RU", + "RW", + "SA", + "SB", + "SC", + "SD", + "SE", + "SF", + "SG", + "SH", + "SI", + "SJ", + "SK", + "SL", + "SM", + "SN", + "SO", + "SR", + "SS", + "ST", + "SU", + "SV", + "SX", + "SY", + "SZ", + "TA", + "TC", + "TD", + "TF", + "TG", + "TJ", + "TK", + "TL", + "TM", + "TN", + "TO", + "TP", + "TR", + "TT", + "TV", + "TW", + "TZ", + "UA", + "UG", + "UK", + "UM", + "US", + "UY", + "UZ", + "VA", + "VC", + "VE", + "VG", + "VI", + "VN", + "VU", + "WF", + "WS", + "XK", + "YE", + "YT", + "YU", + "ZA", + "ZM", + "ZR", + "ZW" + ] + }, + "guid": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "postleitzahl", + "ort" + ] + }, + "Geschaeftspartner": { + "type": "object", + "properties": { + "guid": { + "type": [ + "string", + "null" + ] + }, + "boTyp": { + "type": [ + "string", + "null" + ] + }, + "versionStruktur": { + "type": "integer" + }, + "anrede": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "HERR", + "FRAU", + "EHELEUTE", + "FIRMA", + "INDIVIDUELL", + "DR" + ] + }, + "title": { + "type": [ + "string", + "null" + ] + }, + "name1": { + "type": [ + "string", + "null" + ] + }, + "name2": { + "type": [ + "string", + "null" + ] + }, + "name3": { + "type": [ + "string", + "null" + ] + }, + "gewerbekennzeichnung": { + "type": "boolean" + }, + "hrnummer": { + "type": [ + "string", + "null" + ] + }, + "amtsgericht": { + "type": [ + "string", + "null" + ] + }, + "kontaktweg": { + "type": [ + "array", + "null" + ], + "items": { + "type": "string", + "enum": [ + "ANSCHREIBEN", + "TELEFONAT", + "FAX", + "E_MAIL", + "SMS" + ] + } + }, + "umsatzsteuerId": { + "type": [ + "string", + "null" + ] + }, + "glaeubigerId": { + "type": [ + "string", + "null" + ] + }, + "eMailAdresse": { + "type": [ + "string", + "null" + ] + }, + "website": { + "type": [ + "string", + "null" + ] + }, + "geschaeftspartnerrolle": { + "type": [ + "array", + "null" + ], + "items": { + "type": "string", + "enum": [ + "LIEFERANT", + "DIENSTLEISTER", + "KUNDE", + "INTERESSENT", + "MARKTPARTNER" + ] + } + }, + "partneradresse": { + "$ref": "#/definitions/Adresse" + } + }, + "required": [ + "gewerbekennzeichnung" + ] + }, + "Rufnummer": { + "type": [ + "object", + "null" + ], + "properties": { + "nummerntyp": { + "type": "string", + "enum": [ + "RUF_ZENTRALE", + "FAX_ZENTRALE", + "SAMMELRUF", + "SAMMELFAX", + "ABTEILUNGRUF", + "ABTEILUNGFAX", + "RUF_DURCHWAHL", + "FAX_DURCHWAHL", + "MOBIL_NUMMER" + ] + }, + "rufnummer": { + "type": "string" + }, + "guid": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "nummerntyp", + "rufnummer" + ] + }, + "Zustaendigkeit": { + "type": [ + "object", + "null" + ], + "properties": { + "jobtitel": { + "type": [ + "string", + "null" + ] + }, + "abteilung": { + "type": [ + "string", + "null" + ] + }, + "themengebiet": { + "type": [ + "string", + "null" + ] + }, + "guid": { + "type": [ + "string", + "null" + ] + } + } + } + }, + "type": "object", + "properties": { + "guid": { + "type": [ + "string", + "null" + ] + }, + "boTyp": { + "type": [ + "string", + "null" + ] + }, + "versionStruktur": { + "type": "integer" + }, + "anrede": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "HERR", + "FRAU", + "EHELEUTE", + "FIRMA", + "INDIVIDUELL", + "DR" + ] + }, + "individuelleAnrede": { + "type": [ + "string", + "null" + ] + }, + "titel": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "DR", + "PROF", + "PROF_DR" + ] + }, + "vorname": { + "type": [ + "string", + "null" + ] + }, + "nachname": { + "type": "string" + }, + "eMailAdresse": { + "type": [ + "string", + "null" + ] + }, + "kommentar": { + "type": [ + "string", + "null" + ] + }, + "geschaeftspartner": { + "$ref": "#/definitions/Geschaeftspartner" + }, + "adresse": { + "$ref": "#/definitions/Adresse" + }, + "rufnummer": { + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Rufnummer" + } + }, + "zustaendigkeit": { + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Zustaendigkeit" + } + } + }, + "required": [ + "nachname", + "geschaeftspartner" + ] +} \ No newline at end of file diff --git a/json-schema-files/BO4E.BO.Benachrichtigung.json b/json-schema-files/BO4E.BO.Benachrichtigung.json new file mode 100644 index 00000000..c89fc691 --- /dev/null +++ b/json-schema-files/BO4E.BO.Benachrichtigung.json @@ -0,0 +1,218 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "definitions": { + "Aufgabe": { + "type": [ + "object", + "null" + ], + "properties": { + "aufgabenId": { + "type": "string" + }, + "beschreibung": { + "type": [ + "string", + "null" + ] + }, + "deadline": { + "type": [ + "string", + "null" + ], + "format": "date-time" + }, + "ausgefuehrt": { + "type": "boolean" + }, + "ausfuehrungszeitpunkt": { + "type": [ + "string", + "null" + ], + "format": "date-time" + }, + "ausfuehrender": { + "type": [ + "string", + "null" + ] + }, + "guid": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "aufgabenId", + "ausgefuehrt" + ] + }, + "GenericStringStringInfo": { + "type": [ + "object", + "null" + ], + "properties": { + "keyColumn": { + "type": [ + "string", + "null" + ] + }, + "value": { + "type": [ + "string", + "null" + ] + }, + "guid": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "keyColumn", + "value" + ] + }, + "Notiz": { + "type": [ + "object", + "null" + ], + "properties": { + "guid": { + "type": [ + "string", + "null" + ] + }, + "inhalt": { + "type": "string" + }, + "autor": { + "type": "string" + }, + "zeitpunkt": { + "type": "string", + "format": "date-time" + } + }, + "required": [ + "inhalt", + "autor", + "zeitpunkt" + ] + } + }, + "type": "object", + "properties": { + "guid": { + "type": [ + "string", + "null" + ] + }, + "boTyp": { + "type": [ + "string", + "null" + ] + }, + "versionStruktur": { + "type": "integer" + }, + "benachrichtigungsId": { + "type": "string" + }, + "prioritaet": { + "type": "string", + "default": "NORMAL", + "enum": [ + "SEHR_NIEDRIG", + "NIEDRIG", + "NORMAL", + "HOCH", + "SEHR_HOCH" + ] + }, + "bearbeitungsstatus": { + "type": "string", + "default": "OFFEN", + "enum": [ + "OFFEN", + "IN_BEARBEITUNG", + "ABGESCHLOSSEN", + "STORNIERT", + "QUITTIERT", + "IGNORIERT" + ] + }, + "kurztext": { + "type": "string" + }, + "erstellungsZeitpunkt": { + "type": "string", + "format": "date-time" + }, + "kategorie": { + "type": [ + "string", + "null" + ] + }, + "bearbeiter": { + "type": [ + "string", + "null" + ] + }, + "notizen": { + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Notiz" + } + }, + "deadline": { + "type": [ + "string", + "null" + ], + "format": "date-time" + }, + "aufgaben": { + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Aufgabe" + } + }, + "infos": { + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/GenericStringStringInfo" + } + } + }, + "required": [ + "benachrichtigungsId", + "prioritaet", + "bearbeitungsstatus", + "kurztext", + "erstellungsZeitpunkt" + ] +} \ No newline at end of file diff --git a/json-schema-files/BO4E.BO.Energiemenge.json b/json-schema-files/BO4E.BO.Energiemenge.json new file mode 100644 index 00000000..38b3e014 --- /dev/null +++ b/json-schema-files/BO4E.BO.Energiemenge.json @@ -0,0 +1,122 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "definitions": { + "Verbrauch": { + "type": [ + "object", + "null" + ], + "properties": { + "type": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "ARBEITLEISTUNGTAGESPARAMETERABHMALO", + "VERANSCHLAGTEJAHRESMENGE", + "TUMKUNDENWERT" + ] + }, + "guid": { + "type": [ + "string", + "null" + ] + }, + "wertermittlungsverfahren": { + "type": "string", + "enum": [ + "PROGNOSE", + "MESSUNG" + ] + }, + "obiskennzahl": { + "type": "string" + }, + "startdatum": { + "type": "string", + "format": "date-time" + }, + "wert": { + "type": "number" + }, + "enddatum": { + "type": "string", + "format": "date-time" + }, + "einheit": { + "type": "string", + "enum": [ + "WH", + "KW", + "ANZAHL", + "KUBIKMETER", + "STUNDE", + "TAG", + "MONAT", + "VAR", + "VARH", + "JAHR", + "KWH", + "MW", + "KVAR", + "KVARH", + "MWH" + ] + } + }, + "required": [ + "wertermittlungsverfahren", + "obiskennzahl", + "wert", + "einheit" + ] + } + }, + "type": "object", + "properties": { + "guid": { + "type": [ + "string", + "null" + ] + }, + "boTyp": { + "type": [ + "string", + "null" + ] + }, + "versionStruktur": { + "type": "integer" + }, + "lokationsId": { + "type": "string", + "default": "|null|" + }, + "lokationstyp": { + "type": "string", + "enum": [ + "MaLo", + "MeLo" + ] + }, + "energieverbrauch": { + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Verbrauch" + }, + "minItems": 1 + } + }, + "required": [ + "lokationsId", + "lokationstyp", + "energieverbrauch" + ] +} \ No newline at end of file diff --git a/json-schema-files/BO4E.BO.Geschaeftspartner.json b/json-schema-files/BO4E.BO.Geschaeftspartner.json new file mode 100644 index 00000000..2d5332a0 --- /dev/null +++ b/json-schema-files/BO4E.BO.Geschaeftspartner.json @@ -0,0 +1,469 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "definitions": { + "Adresse": { + "type": [ + "object", + "null" + ], + "properties": { + "postleitzahl": { + "type": "string" + }, + "ort": { + "type": "string" + }, + "strasse": { + "type": [ + "string", + "null" + ] + }, + "hausnummer": { + "type": [ + "string", + "null" + ] + }, + "postfach": { + "type": [ + "string", + "null" + ] + }, + "adresszusatz": { + "type": [ + "string", + "null" + ] + }, + "coErgaenzung": { + "type": [ + "string", + "null" + ] + }, + "landescode": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "AC", + "AD", + "AE", + "AF", + "AG", + "AI", + "AL", + "AM", + "AN", + "AO", + "AQ", + "AR", + "AS", + "AT", + "AU", + "AW", + "AX", + "AZ", + "BA", + "BB", + "BD", + "BE", + "BF", + "BG", + "BH", + "BI", + "BJ", + "BL", + "BM", + "BN", + "BO", + "BQ", + "BR", + "BS", + "BT", + "BU", + "BV", + "BW", + "BY", + "BZ", + "CA", + "CC", + "CD", + "CF", + "CG", + "CH", + "CI", + "CK", + "CL", + "CM", + "CN", + "CO", + "CP", + "CR", + "CS", + "CU", + "CV", + "CW", + "CX", + "CY", + "CZ", + "DE", + "DG", + "DJ", + "DK", + "DM", + "DO", + "DZ", + "EA", + "EC", + "EE", + "EG", + "EH", + "ER", + "ES", + "ET", + "EU", + "FI", + "FJ", + "FK", + "FM", + "FO", + "FR", + "FX", + "GA", + "GB", + "GD", + "GE", + "GF", + "GG", + "GH", + "GI", + "GL", + "GM", + "GN", + "GP", + "GQ", + "GR", + "GS", + "GT", + "GU", + "GW", + "GY", + "HK", + "HM", + "HN", + "HR", + "HT", + "HU", + "IC", + "ID", + "IE", + "IL", + "IM", + "IN", + "IO", + "IQ", + "IR", + "IS", + "IT", + "JE", + "JM", + "JO", + "JP", + "KE", + "KG", + "KH", + "KI", + "KM", + "KN", + "KP", + "KR", + "KW", + "KY", + "KZ", + "LA", + "LB", + "LC", + "LI", + "LK", + "LR", + "LS", + "LT", + "LU", + "LV", + "LY", + "MA", + "MC", + "MD", + "ME", + "MF", + "MG", + "MH", + "MK", + "ML", + "MM", + "MN", + "MO", + "MP", + "MQ", + "MR", + "MS", + "MT", + "MU", + "MV", + "MW", + "MX", + "MY", + "MZ", + "NA", + "NC", + "NE", + "NF", + "NG", + "NI", + "NL", + "NO", + "NP", + "NR", + "NT", + "NU", + "NZ", + "OM", + "PA", + "PE", + "PF", + "PG", + "PH", + "PK", + "PL", + "PM", + "PN", + "PR", + "PS", + "PT", + "PW", + "PY", + "QA", + "RE", + "RO", + "RS", + "RU", + "RW", + "SA", + "SB", + "SC", + "SD", + "SE", + "SF", + "SG", + "SH", + "SI", + "SJ", + "SK", + "SL", + "SM", + "SN", + "SO", + "SR", + "SS", + "ST", + "SU", + "SV", + "SX", + "SY", + "SZ", + "TA", + "TC", + "TD", + "TF", + "TG", + "TJ", + "TK", + "TL", + "TM", + "TN", + "TO", + "TP", + "TR", + "TT", + "TV", + "TW", + "TZ", + "UA", + "UG", + "UK", + "UM", + "US", + "UY", + "UZ", + "VA", + "VC", + "VE", + "VG", + "VI", + "VN", + "VU", + "WF", + "WS", + "XK", + "YE", + "YT", + "YU", + "ZA", + "ZM", + "ZR", + "ZW" + ] + }, + "guid": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "postleitzahl", + "ort" + ] + } + }, + "type": "object", + "properties": { + "guid": { + "type": [ + "string", + "null" + ] + }, + "boTyp": { + "type": [ + "string", + "null" + ] + }, + "versionStruktur": { + "type": "integer" + }, + "anrede": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "HERR", + "FRAU", + "EHELEUTE", + "FIRMA", + "INDIVIDUELL", + "DR" + ] + }, + "title": { + "type": [ + "string", + "null" + ] + }, + "name1": { + "type": [ + "string", + "null" + ] + }, + "name2": { + "type": [ + "string", + "null" + ] + }, + "name3": { + "type": [ + "string", + "null" + ] + }, + "gewerbekennzeichnung": { + "type": "boolean" + }, + "hrnummer": { + "type": [ + "string", + "null" + ] + }, + "amtsgericht": { + "type": [ + "string", + "null" + ] + }, + "kontaktweg": { + "type": [ + "array", + "null" + ], + "items": { + "type": "string", + "enum": [ + "ANSCHREIBEN", + "TELEFONAT", + "FAX", + "E_MAIL", + "SMS" + ] + } + }, + "umsatzsteuerId": { + "type": [ + "string", + "null" + ] + }, + "glaeubigerId": { + "type": [ + "string", + "null" + ] + }, + "eMailAdresse": { + "type": [ + "string", + "null" + ] + }, + "website": { + "type": [ + "string", + "null" + ] + }, + "geschaeftspartnerrolle": { + "type": [ + "array", + "null" + ], + "items": { + "type": "string", + "enum": [ + "LIEFERANT", + "DIENSTLEISTER", + "KUNDE", + "INTERESSENT", + "MARKTPARTNER" + ] + } + }, + "partneradresse": { + "$ref": "#/definitions/Adresse" + } + }, + "required": [ + "gewerbekennzeichnung" + ] +} \ No newline at end of file diff --git a/json-schema-files/BO4E.BO.Kosten.json b/json-schema-files/BO4E.BO.Kosten.json new file mode 100644 index 00000000..86ab878b --- /dev/null +++ b/json-schema-files/BO4E.BO.Kosten.json @@ -0,0 +1,708 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "definitions": { + "Betrag": { + "type": [ + "object", + "null" + ], + "properties": { + "wert": { + "type": "number" + }, + "waehrung": { + "type": "string", + "enum": [ + "AFN", + "ALL", + "AMD", + "ANG", + "AOA", + "ARS", + "AUD", + "AWG", + "AZN", + "BAM", + "BBD", + "BDT", + "BGN", + "BHD", + "BIF", + "BMD", + "BND", + "BOB", + "BOV", + "BRL", + "BSD", + "BTN", + "BWP", + "BYN", + "BYR", + "BZD", + "CAD", + "CDF", + "CHE", + "CHF", + "CHW", + "CLF", + "CLP", + "CNY", + "COP", + "COU", + "CRC", + "CUC", + "CUP", + "CVE", + "CZK", + "DJF", + "DKK", + "DOP", + "DZD", + "EGP", + "ERN", + "ETB", + "EUR", + "FJD", + "FKP", + "GBP", + "GEL", + "GHS", + "GIP", + "GMD", + "GNF", + "GTQ", + "GYD", + "HKD", + "HNL", + "HRK", + "HTG", + "HUF", + "IDR", + "ILS", + "INR", + "IQD", + "IRR", + "ISK", + "JMD", + "JOD", + "JPY", + "KES", + "KGS", + "KHR", + "KMF", + "KPW", + "KRW", + "KWD", + "KYD", + "KZT", + "LAK", + "LBP", + "LKR", + "LRD", + "LSL", + "LTL", + "LYD", + "MAD", + "MDL", + "MGA", + "MKD", + "MMK", + "MNT", + "MOP", + "MRO", + "MUR", + "MVR", + "MWK", + "MXN", + "MXV", + "MYR", + "MZN", + "NAD", + "NGN", + "NIO", + "NOK", + "NPR", + "NZD", + "OMR", + "PAB", + "PEN", + "PGK", + "PHP", + "PKR", + "PLN", + "PYG", + "QAR", + "RON", + "RSD", + "RUB", + "RUR", + "RWF", + "SAR", + "SBD", + "SCR", + "SDG", + "SEK", + "SGD", + "SHP", + "SLL", + "SOS", + "SRD", + "SSP", + "STD", + "SVC", + "SYP", + "SZL", + "THB", + "TJS", + "TMT", + "TND", + "TOP", + "TRY", + "TTD", + "TWD", + "TZS", + "UAH", + "UGX", + "USD", + "USN", + "USS", + "UYI", + "UYU", + "UZS", + "VEF", + "VND", + "VUV", + "WST", + "XAF", + "XAG", + "XAU", + "XBA", + "XBB", + "XBC", + "XBD", + "XCD", + "XDR", + "XOF", + "XPD", + "XPF", + "XPT", + "XSU", + "XTS", + "XUA", + "XXX", + "YER", + "ZAR", + "ZMW", + "ZWL" + ] + }, + "guid": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "wert", + "waehrung" + ] + }, + "Betrag-1": { + "type": "object", + "properties": { + "wert": { + "type": "number" + }, + "waehrung": { + "type": "string", + "enum": [ + "AFN", + "ALL", + "AMD", + "ANG", + "AOA", + "ARS", + "AUD", + "AWG", + "AZN", + "BAM", + "BBD", + "BDT", + "BGN", + "BHD", + "BIF", + "BMD", + "BND", + "BOB", + "BOV", + "BRL", + "BSD", + "BTN", + "BWP", + "BYN", + "BYR", + "BZD", + "CAD", + "CDF", + "CHE", + "CHF", + "CHW", + "CLF", + "CLP", + "CNY", + "COP", + "COU", + "CRC", + "CUC", + "CUP", + "CVE", + "CZK", + "DJF", + "DKK", + "DOP", + "DZD", + "EGP", + "ERN", + "ETB", + "EUR", + "FJD", + "FKP", + "GBP", + "GEL", + "GHS", + "GIP", + "GMD", + "GNF", + "GTQ", + "GYD", + "HKD", + "HNL", + "HRK", + "HTG", + "HUF", + "IDR", + "ILS", + "INR", + "IQD", + "IRR", + "ISK", + "JMD", + "JOD", + "JPY", + "KES", + "KGS", + "KHR", + "KMF", + "KPW", + "KRW", + "KWD", + "KYD", + "KZT", + "LAK", + "LBP", + "LKR", + "LRD", + "LSL", + "LTL", + "LYD", + "MAD", + "MDL", + "MGA", + "MKD", + "MMK", + "MNT", + "MOP", + "MRO", + "MUR", + "MVR", + "MWK", + "MXN", + "MXV", + "MYR", + "MZN", + "NAD", + "NGN", + "NIO", + "NOK", + "NPR", + "NZD", + "OMR", + "PAB", + "PEN", + "PGK", + "PHP", + "PKR", + "PLN", + "PYG", + "QAR", + "RON", + "RSD", + "RUB", + "RUR", + "RWF", + "SAR", + "SBD", + "SCR", + "SDG", + "SEK", + "SGD", + "SHP", + "SLL", + "SOS", + "SRD", + "SSP", + "STD", + "SVC", + "SYP", + "SZL", + "THB", + "TJS", + "TMT", + "TND", + "TOP", + "TRY", + "TTD", + "TWD", + "TZS", + "UAH", + "UGX", + "USD", + "USN", + "USS", + "UYI", + "UYU", + "UZS", + "VEF", + "VND", + "VUV", + "WST", + "XAF", + "XAG", + "XAU", + "XBA", + "XBB", + "XBC", + "XBD", + "XCD", + "XDR", + "XOF", + "XPD", + "XPF", + "XPT", + "XSU", + "XTS", + "XUA", + "XXX", + "YER", + "ZAR", + "ZMW", + "ZWL" + ] + }, + "guid": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "wert", + "waehrung" + ] + }, + "Kostenblock": { + "type": [ + "object", + "null" + ], + "properties": { + "kostenblockbezeichnung": { + "type": "string" + }, + "summeKostenblock": { + "$ref": "#/definitions/Betrag" + }, + "kostenpositionen": { + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Kostenposition" + } + }, + "guid": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "kostenblockbezeichnung" + ] + }, + "Kostenposition": { + "type": [ + "object", + "null" + ], + "properties": { + "positionstitel": { + "type": "string" + }, + "von": { + "type": [ + "string", + "null" + ], + "format": "date-time" + }, + "bis": { + "type": [ + "string", + "null" + ], + "format": "date-time" + }, + "artikelbezeichnung": { + "type": "string" + }, + "artikeldetail": { + "type": [ + "string", + "null" + ] + }, + "menge": { + "$ref": "#/definitions/Menge" + }, + "zeitmenge": { + "$ref": "#/definitions/Menge" + }, + "einzelpreis": { + "$ref": "#/definitions/Preis" + }, + "betragKostenposition": { + "$ref": "#/definitions/Betrag-1" + }, + "guid": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "positionstitel", + "artikelbezeichnung", + "einzelpreis", + "betragKostenposition" + ] + }, + "Menge": { + "type": [ + "object", + "null" + ], + "properties": { + "wert": { + "type": "number" + }, + "einheit": { + "type": "string", + "enum": [ + "WH", + "KW", + "ANZAHL", + "KUBIKMETER", + "STUNDE", + "TAG", + "MONAT", + "VAR", + "VARH", + "JAHR", + "KWH", + "MW", + "KVAR", + "KVARH", + "MWH" + ] + }, + "guid": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "wert", + "einheit" + ] + }, + "Preis": { + "type": "object", + "properties": { + "wert": { + "type": "number" + }, + "einheit": { + "type": "string", + "enum": [ + "EUR", + "CT" + ] + }, + "bezugswert": { + "type": "string", + "enum": [ + "WH", + "KW", + "ANZAHL", + "KUBIKMETER", + "STUNDE", + "TAG", + "MONAT", + "VAR", + "VARH", + "JAHR", + "KWH", + "MW", + "KVAR", + "KVARH", + "MWH" + ] + }, + "status": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "VORLAEUFIG", + "ENDGUELTIG" + ] + }, + "guid": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "wert", + "einheit", + "bezugswert" + ] + }, + "Zeitraum": { + "type": "object", + "properties": { + "einheit": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "SEKUNDE", + "MINUTE", + "STUNDE", + "VIERTEL_STUNDE", + "TAG", + "WOCHE", + "MONAT", + "QUARTAL", + "HALBJAHR", + "JAHR" + ] + }, + "dauer": { + "type": [ + "number", + "null" + ] + }, + "startdatum": { + "type": [ + "string", + "null" + ], + "format": "date-time" + }, + "enddatum": { + "type": [ + "string", + "null" + ], + "format": "date-time" + }, + "guid": { + "type": [ + "string", + "null" + ] + } + } + } + }, + "type": "object", + "properties": { + "guid": { + "type": [ + "string", + "null" + ] + }, + "boTyp": { + "type": [ + "string", + "null" + ] + }, + "versionStruktur": { + "type": "integer" + }, + "kostenklasse": { + "type": "string" + }, + "gueltigkeit": { + "$ref": "#/definitions/Zeitraum" + }, + "summeKosten": { + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Betrag" + } + }, + "kostenbloecke": { + "type": "array", + "items": { + "$ref": "#/definitions/Kostenblock" + }, + "minItems": 1 + }, + "kostenpositionen": { + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Kostenposition" + } + } + }, + "required": [ + "kostenklasse", + "gueltigkeit", + "kostenbloecke" + ] +} \ No newline at end of file diff --git a/json-schema-files/BO4E.BO.LogObject.json b/json-schema-files/BO4E.BO.LogObject.json new file mode 100644 index 00000000..955d1082 --- /dev/null +++ b/json-schema-files/BO4E.BO.LogObject.json @@ -0,0 +1,36 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "type": "object", + "properties": { + "guid": { + "type": [ + "string", + "null" + ] + }, + "boTyp": { + "type": [ + "string", + "null" + ] + }, + "versionStruktur": { + "type": "integer" + }, + "id": { + "type": "string" + }, + "datetime": { + "type": "string", + "format": "date-time" + }, + "logMessage": { + "type": "string" + } + }, + "required": [ + "id", + "datetime", + "logMessage" + ] +} \ No newline at end of file diff --git a/json-schema-files/BO4E.BO.Marktlokation.json b/json-schema-files/BO4E.BO.Marktlokation.json new file mode 100644 index 00000000..3909dd1f --- /dev/null +++ b/json-schema-files/BO4E.BO.Marktlokation.json @@ -0,0 +1,1687 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "definitions": { + "Adresse": { + "type": [ + "object", + "null" + ], + "properties": { + "postleitzahl": { + "type": "string" + }, + "ort": { + "type": "string" + }, + "strasse": { + "type": [ + "string", + "null" + ] + }, + "hausnummer": { + "type": [ + "string", + "null" + ] + }, + "postfach": { + "type": [ + "string", + "null" + ] + }, + "adresszusatz": { + "type": [ + "string", + "null" + ] + }, + "coErgaenzung": { + "type": [ + "string", + "null" + ] + }, + "landescode": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "AC", + "AD", + "AE", + "AF", + "AG", + "AI", + "AL", + "AM", + "AN", + "AO", + "AQ", + "AR", + "AS", + "AT", + "AU", + "AW", + "AX", + "AZ", + "BA", + "BB", + "BD", + "BE", + "BF", + "BG", + "BH", + "BI", + "BJ", + "BL", + "BM", + "BN", + "BO", + "BQ", + "BR", + "BS", + "BT", + "BU", + "BV", + "BW", + "BY", + "BZ", + "CA", + "CC", + "CD", + "CF", + "CG", + "CH", + "CI", + "CK", + "CL", + "CM", + "CN", + "CO", + "CP", + "CR", + "CS", + "CU", + "CV", + "CW", + "CX", + "CY", + "CZ", + "DE", + "DG", + "DJ", + "DK", + "DM", + "DO", + "DZ", + "EA", + "EC", + "EE", + "EG", + "EH", + "ER", + "ES", + "ET", + "EU", + "FI", + "FJ", + "FK", + "FM", + "FO", + "FR", + "FX", + "GA", + "GB", + "GD", + "GE", + "GF", + "GG", + "GH", + "GI", + "GL", + "GM", + "GN", + "GP", + "GQ", + "GR", + "GS", + "GT", + "GU", + "GW", + "GY", + "HK", + "HM", + "HN", + "HR", + "HT", + "HU", + "IC", + "ID", + "IE", + "IL", + "IM", + "IN", + "IO", + "IQ", + "IR", + "IS", + "IT", + "JE", + "JM", + "JO", + "JP", + "KE", + "KG", + "KH", + "KI", + "KM", + "KN", + "KP", + "KR", + "KW", + "KY", + "KZ", + "LA", + "LB", + "LC", + "LI", + "LK", + "LR", + "LS", + "LT", + "LU", + "LV", + "LY", + "MA", + "MC", + "MD", + "ME", + "MF", + "MG", + "MH", + "MK", + "ML", + "MM", + "MN", + "MO", + "MP", + "MQ", + "MR", + "MS", + "MT", + "MU", + "MV", + "MW", + "MX", + "MY", + "MZ", + "NA", + "NC", + "NE", + "NF", + "NG", + "NI", + "NL", + "NO", + "NP", + "NR", + "NT", + "NU", + "NZ", + "OM", + "PA", + "PE", + "PF", + "PG", + "PH", + "PK", + "PL", + "PM", + "PN", + "PR", + "PS", + "PT", + "PW", + "PY", + "QA", + "RE", + "RO", + "RS", + "RU", + "RW", + "SA", + "SB", + "SC", + "SD", + "SE", + "SF", + "SG", + "SH", + "SI", + "SJ", + "SK", + "SL", + "SM", + "SN", + "SO", + "SR", + "SS", + "ST", + "SU", + "SV", + "SX", + "SY", + "SZ", + "TA", + "TC", + "TD", + "TF", + "TG", + "TJ", + "TK", + "TL", + "TM", + "TN", + "TO", + "TP", + "TR", + "TT", + "TV", + "TW", + "TZ", + "UA", + "UG", + "UK", + "UM", + "US", + "UY", + "UZ", + "VA", + "VC", + "VE", + "VG", + "VI", + "VN", + "VU", + "WF", + "WS", + "XK", + "YE", + "YT", + "YU", + "ZA", + "ZM", + "ZR", + "ZW" + ] + }, + "guid": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "postleitzahl", + "ort" + ] + }, + "Dienstleistung": { + "type": [ + "object", + "null" + ], + "properties": { + "dienstleistungstyp": { + "type": "string", + "enum": [ + "DATENBEREITSTELLUNG_TAEGLICH", + "DATENBEREITSTELLUNG_WOECHENTLICH", + "DATENBEREITSTELLUNG_MONATLICH", + "DATENBEREITSTELLUNG_JAEHRLICH", + "DATENBEREITSTELLUNG_HISTORISCHE_LG", + "DATENBEREITSTELLUNG_STUENDLICH", + "DATENBEREITSTELLUNG_VIERTELJAEHRLICH", + "DATENBEREITSTELLUNG_HALBJAEHRLICH", + "DATENBEREITSTELLUNG_MONATLICH_ZUSAETZLICH", + "DATENBEREITSTELLUNG_EINMALIG", + "AUSLESUNG_2X_TAEGLICH_FERNAUSLESUNG", + "AUSLESUNG_TAEGLICH_FERNAUSLESUNG", + "AUSLESUNG_LGK_MANUELL_MSB", + "AUSLESUNG_MONATLICH_SLP_FERNAUSLESUNG", + "AUSLESUNG_JAEHRLICH_SLP_FERNAUSLESUNG", + "AUSLESUNG_MDE_SLP", + "ABLESUNG_MONATLICH_SLP", + "ABLESUNG_VIERTELJAEHRLICH_SLP", + "ABLESUNG_HALBJAEHRLICH_SLP", + "ABLESUNG_JAEHRLICH_SLP", + "AUSLESUNG_SLP_FERNAUSLESUNG", + "ABLESUNG_SLP_ZUSAETZLICH_MSB", + "ABLESUNG_SLP_ZUSAETZLICH_KUNDE", + "AUSLESUNG_LGK_FERNAUSLESUNG_ZUSAETZLICH_MSB", + "AUSLESUNG_MOATLICH_FERNAUSLESUNG", + "AUSLESUNG_STUENDLICH_FERNAUSLESUNG", + "ABLESUNG_MONATLICH_LGK", + "AUSLESUNG_TEMERATURMENGENUMWERTER", + "AUSLESUNG_ZUSTANDSMENGENUMWERTER", + "AUSLESUNG_SYSTEMMENGENUMWERTER", + "AUSLESUNG_VORGANG_SLP", + "AUSLESUUNG_KOMPAKTMENGENUMWERTER", + "AUSLESUNG_MDE_LGK", + "SPERRUNG_SLP", + "ENTSPERRUNG_SLP", + "SPERRUNG_RLM", + "ENTSPERRUNG_RLM", + "MAHNKOSTEN", + "INKASSOKOSTEN" + ] + }, + "bezeichnung": { + "type": "string" + }, + "guid": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "dienstleistungstyp", + "bezeichnung" + ] + }, + "Geokoordinaten": { + "type": [ + "object", + "null" + ], + "properties": { + "breitengrad": { + "type": "number" + }, + "laengengrad": { + "type": "number" + }, + "guid": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "breitengrad", + "laengengrad" + ] + }, + "Geraeteeigenschaften": { + "type": [ + "object", + "null" + ], + "properties": { + "geraetetyp": { + "type": "string", + "enum": [ + "WECHSELSTROMZAEHLER", + "DREHSTROMZAEHLER", + "ZWEIRICHTUNGSZAEHLER", + "RLM_ZAEHLER", + "IMS_ZAEHLER", + "BALGENGASZAEHLER", + "MAXIMUMZAEHLER", + "MULTIPLEXANLAGE", + "PAUSCHALANLAGE", + "VERSTAERKERANLAGE", + "SUMMATIONSGERAET", + "IMPULSGEBER", + "EDL_21_ZAEHLERAUFSATZ", + "VIER_QUADRANTEN_LASTGANGZAEHLER", + "MENGENUMWERTER", + "STROMWANDLER", + "SPANNUNGSWANDLER", + "DATENLOGGER", + "KOMMUNIKATIONSANSCHLUSS", + "MODEM", + "TELEKOMMUNIKATIONSEINRICHTUNG", + "DREHKOLBENGASZAEHLER", + "TURBINENRADGASZAEHLER", + "ULTRASCHALLZAEHLER", + "WIRBELGASZAEHLER", + "MODERNE_MESSEINRICHTUNG", + "ELEKTRONISCHER_HAUSHALTSZAEHLER", + "STEUEREINRICHTUNG", + "TECHNISCHESTEUEREINRICHTUNG", + "TARIFSCHALTGERAET", + "RUNDSTEUEREMPFAENGER", + "OPTIONALE_ZUS_ZAEHLEINRICHTUNG", + "MESSWANDLERSATZ_IMS_MME", + "KOMBIMESSWANDLER_IMS_MME", + "TARIFSCHALTGERAET_IMS_MME", + "RUNDSTEUEREMPFAENGER_IMS_MME", + "TEMPERATUR_KOMPENSATION", + "HOECHSTBELASTUNGS_ANZEIGER", + "SONSTIGES_GERAET", + "SMARTMETERGATEWAY", + "STEUERBOX", + "BLOCKSTROMWANDLER", + "KOMBIMESSWANDLER" + ] + }, + "geraetemerkmal": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "EINTARIF", + "ZWEITARIF", + "MEHRTARIF", + "GAS_G2_5", + "GAS_G4", + "GAS_G6", + "GAS_G10", + "GAS_G16", + "GAS_G25", + "GAS_G40", + "GAS_G65", + "GAS_G100", + "GAS_G160", + "GAS_G250", + "GAS_G400", + "GAS_G650", + "GAS_G1000", + "GAS_G1600", + "GAS_G2500", + "IMPULSGEBER_G4_G100", + "IMPULSGEBER_G100", + "MODEM_GSM", + "MODEM_GPRS", + "MODEM_FUNK", + "MODEM_GSM_O_LG", + "MODEM_GSM_M_LG", + "MODEM_FESTNETZ", + "MODEM_GPRS_M_LG", + "PLC_COM", + "ETHERNET_KOM", + "DSL_KOM", + "LTE_KOM", + "RUNDSTEUEREMPFAENGER", + "TARIFSCHALTGERAET", + "ZUSTANDS_MU", + "TEMPERATUR_MU", + "KOMPAKT_MU", + "SYSTEM_MU" + ] + }, + "parameter": { + "type": [ + "object", + "null" + ], + "additionalProperties": { + "type": [ + "string", + "null" + ] + } + }, + "guid": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "geraetetyp" + ] + }, + "Geschaeftspartner": { + "type": [ + "object", + "null" + ], + "properties": { + "guid": { + "type": [ + "string", + "null" + ] + }, + "boTyp": { + "type": [ + "string", + "null" + ] + }, + "versionStruktur": { + "type": "integer" + }, + "anrede": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "HERR", + "FRAU", + "EHELEUTE", + "FIRMA", + "INDIVIDUELL", + "DR" + ] + }, + "title": { + "type": [ + "string", + "null" + ] + }, + "name1": { + "type": [ + "string", + "null" + ] + }, + "name2": { + "type": [ + "string", + "null" + ] + }, + "name3": { + "type": [ + "string", + "null" + ] + }, + "gewerbekennzeichnung": { + "type": "boolean" + }, + "hrnummer": { + "type": [ + "string", + "null" + ] + }, + "amtsgericht": { + "type": [ + "string", + "null" + ] + }, + "kontaktweg": { + "type": [ + "array", + "null" + ], + "items": { + "type": "string", + "enum": [ + "ANSCHREIBEN", + "TELEFONAT", + "FAX", + "E_MAIL", + "SMS" + ] + } + }, + "umsatzsteuerId": { + "type": [ + "string", + "null" + ] + }, + "glaeubigerId": { + "type": [ + "string", + "null" + ] + }, + "eMailAdresse": { + "type": [ + "string", + "null" + ] + }, + "website": { + "type": [ + "string", + "null" + ] + }, + "geschaeftspartnerrolle": { + "type": [ + "array", + "null" + ], + "items": { + "type": "string", + "enum": [ + "LIEFERANT", + "DIENSTLEISTER", + "KUNDE", + "INTERESSENT", + "MARKTPARTNER" + ] + } + }, + "partneradresse": { + "$ref": "#/definitions/Adresse" + } + }, + "required": [ + "gewerbekennzeichnung" + ] + }, + "Hardware": { + "type": [ + "object", + "null" + ], + "properties": { + "geraetetyp": { + "type": "string", + "enum": [ + "WECHSELSTROMZAEHLER", + "DREHSTROMZAEHLER", + "ZWEIRICHTUNGSZAEHLER", + "RLM_ZAEHLER", + "IMS_ZAEHLER", + "BALGENGASZAEHLER", + "MAXIMUMZAEHLER", + "MULTIPLEXANLAGE", + "PAUSCHALANLAGE", + "VERSTAERKERANLAGE", + "SUMMATIONSGERAET", + "IMPULSGEBER", + "EDL_21_ZAEHLERAUFSATZ", + "VIER_QUADRANTEN_LASTGANGZAEHLER", + "MENGENUMWERTER", + "STROMWANDLER", + "SPANNUNGSWANDLER", + "DATENLOGGER", + "KOMMUNIKATIONSANSCHLUSS", + "MODEM", + "TELEKOMMUNIKATIONSEINRICHTUNG", + "DREHKOLBENGASZAEHLER", + "TURBINENRADGASZAEHLER", + "ULTRASCHALLZAEHLER", + "WIRBELGASZAEHLER", + "MODERNE_MESSEINRICHTUNG", + "ELEKTRONISCHER_HAUSHALTSZAEHLER", + "STEUEREINRICHTUNG", + "TECHNISCHESTEUEREINRICHTUNG", + "TARIFSCHALTGERAET", + "RUNDSTEUEREMPFAENGER", + "OPTIONALE_ZUS_ZAEHLEINRICHTUNG", + "MESSWANDLERSATZ_IMS_MME", + "KOMBIMESSWANDLER_IMS_MME", + "TARIFSCHALTGERAET_IMS_MME", + "RUNDSTEUEREMPFAENGER_IMS_MME", + "TEMPERATUR_KOMPENSATION", + "HOECHSTBELASTUNGS_ANZEIGER", + "SONSTIGES_GERAET", + "SMARTMETERGATEWAY", + "STEUERBOX", + "BLOCKSTROMWANDLER", + "KOMBIMESSWANDLER" + ] + }, + "bezeichnung": { + "type": "string" + }, + "geraeteeigenschaften": { + "$ref": "#/definitions/Geraeteeigenschaften" + }, + "geraetenummer": { + "type": [ + "string", + "null" + ] + }, + "geraetereferenz": { + "type": [ + "string", + "null" + ] + }, + "guid": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "geraetetyp", + "bezeichnung" + ] + }, + "Katasteradresse": { + "type": [ + "object", + "null" + ], + "properties": { + "gemarkung_flur": { + "type": "string" + }, + "flurstueck": { + "type": "string" + }, + "guid": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "gemarkung_flur", + "flurstueck" + ] + }, + "Konzessionsabgabe": { + "type": [ + "object", + "null" + ], + "properties": { + "guid": { + "type": [ + "string", + "null" + ] + }, + "kosten": { + "type": "number" + }, + "kategorie": { + "type": "string" + }, + "satz": { + "type": "string", + "enum": [ + "KAS", + "SA", + "SAS", + "TA", + "TAS", + "TK", + "TKS", + "TS", + "TSS" + ] + } + }, + "required": [ + "kosten", + "kategorie", + "satz" + ] + }, + "Marktrolle": { + "type": [ + "object", + "null" + ], + "properties": { + "rollencodenummer": { + "type": [ + "string", + "null" + ] + }, + "code": { + "type": [ + "string", + "null" + ] + }, + "marktrolle": { + "type": "string", + "enum": [ + "NB", + "LF", + "MSB", + "MDL", + "DL", + "BKV", + "BIKO", + "UENB", + "KUNDE_SELBST_NN", + "MGV", + "EIV", + "RB", + "KUNDE", + "INTERESSENT" + ] + }, + "guid": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "marktrolle" + ] + }, + "Messlokation": { + "type": [ + "object", + "null" + ], + "properties": { + "guid": { + "type": [ + "string", + "null" + ] + }, + "boTyp": { + "type": [ + "string", + "null" + ] + }, + "versionStruktur": { + "type": "integer" + }, + "messLokationsId": { + "type": "string", + "default": "|null|" + }, + "sparte": { + "type": "string", + "enum": [ + "STROM", + "GAS", + "FERNWAERME", + "NAHWAERME", + "WASSER", + "ABWASSER" + ] + }, + "netzebeneMessung": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "NSP", + "MSP", + "HSP", + "HSS", + "MSP_NSP_UMSP", + "HSP_MSP_UMSP", + "HSS_HSP_UMSP", + "HD", + "MD", + "ND" + ] + }, + "messgebietNr": { + "type": [ + "string", + "null" + ] + }, + "grundzustaendigerMSBCodeNr": { + "type": [ + "string", + "null" + ] + }, + "grundzustaendigerMSBIMCodeNr": { + "type": [ + "string", + "null" + ] + }, + "grundzustaendigerMDLodeNr": { + "type": [ + "string", + "null" + ] + }, + "messadresse": { + "$ref": "#/definitions/Adresse" + }, + "geoadresse": { + "$ref": "#/definitions/Geokoordinaten" + }, + "katasterinformation": { + "$ref": "#/definitions/Katasteradresse" + }, + "geraete": { + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Hardware" + } + }, + "messdienstleistung": { + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Dienstleistung" + } + }, + "messlokationszaehler": { + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Zaehler" + } + }, + "bilanzierungsmethode": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "RLM", + "SLP", + "TLP_GEMEINSAM", + "TLP_GETRENNT", + "PAUSCHAL", + "IMS" + ] + }, + "abrechnungmessstellenbetriebnna": { + "type": [ + "boolean", + "null" + ] + }, + "marktrollen": { + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Marktrolle" + } + }, + "gasqualitaet": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "H_GAS", + "H_GAS", + "L_GAS", + "L_GAS" + ] + }, + "verlustfaktor": { + "type": [ + "number", + "null" + ] + } + }, + "required": [ + "messLokationsId", + "sparte" + ] + }, + "Messlokationszuordnung": { + "type": [ + "object", + "null" + ], + "properties": { + "messlokationsId": { + "type": "string" + }, + "arithmetik": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "ADDITION", + "SUBTRAKTION", + "MULTIPLIKATION", + "DIVISION" + ] + }, + "gueltigSeit": { + "type": [ + "string", + "null" + ], + "format": "date-time" + }, + "gueltigBis": { + "type": [ + "string", + "null" + ], + "format": "date-time" + }, + "guid": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "messlokationsId" + ] + }, + "Verbrauch": { + "type": [ + "object", + "null" + ], + "properties": { + "type": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "ARBEITLEISTUNGTAGESPARAMETERABHMALO", + "VERANSCHLAGTEJAHRESMENGE", + "TUMKUNDENWERT" + ] + }, + "guid": { + "type": [ + "string", + "null" + ] + }, + "wertermittlungsverfahren": { + "type": "string", + "enum": [ + "PROGNOSE", + "MESSUNG" + ] + }, + "obiskennzahl": { + "type": "string" + }, + "startdatum": { + "type": "string", + "format": "date-time" + }, + "wert": { + "type": "number" + }, + "enddatum": { + "type": "string", + "format": "date-time" + }, + "einheit": { + "type": "string", + "enum": [ + "WH", + "KW", + "ANZAHL", + "KUBIKMETER", + "STUNDE", + "TAG", + "MONAT", + "VAR", + "VARH", + "JAHR", + "KWH", + "MW", + "KVAR", + "KVARH", + "MWH" + ] + } + }, + "required": [ + "wertermittlungsverfahren", + "obiskennzahl", + "wert", + "einheit" + ] + }, + "Zaehler": { + "type": [ + "object", + "null" + ], + "properties": { + "guid": { + "type": [ + "string", + "null" + ] + }, + "boTyp": { + "type": [ + "string", + "null" + ] + }, + "versionStruktur": { + "type": "integer" + }, + "zaehlernummer": { + "type": "string" + }, + "sparte": { + "type": "string", + "enum": [ + "STROM", + "GAS", + "FERNWAERME", + "NAHWAERME", + "WASSER", + "ABWASSER" + ] + }, + "zaehlerauspraegung": { + "type": "string", + "enum": [ + "EINRICHTUNGSZAEHLER", + "ZWEIRICHTUNGSZAEHLER" + ] + }, + "zaehlertyp": { + "type": "string", + "enum": [ + "DREHSTROMZAEHLER", + "BALGENGASZAEHLER", + "DREHKOLBENZAEHLER", + "SMARTMETER", + "LEISTUNGSZAEHLER", + "MAXIMUMZAEHLER", + "TURBINENRADGASZAEHLER", + "ULTRASCHALLGASZAEHLER", + "WECHSELSTROMZAEHLER" + ] + }, + "tarifart": { + "type": "string", + "enum": [ + "EINTARIF", + "ZWEITARIF", + "MEHRTARIF", + "SMART_METER", + "LEISTUNGSGEMESSEN" + ] + }, + "zaehlerkonstante": { + "type": "number" + }, + "eichungBis": { + "type": [ + "string", + "null" + ], + "format": "date-time" + }, + "letzteEichung": { + "type": [ + "string", + "null" + ], + "format": "date-time" + }, + "zaehlwerke": { + "type": "array", + "items": { + "$ref": "#/definitions/Zaehlwerk" + }, + "minItems": 1 + }, + "zaehlerhersteller": { + "$ref": "#/definitions/Geschaeftspartner" + }, + "gateway": { + "type": [ + "string", + "null" + ] + }, + "fernschaltung": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "VORHANDEN", + "NICHT_VORHANDEN" + ] + }, + "messwerterfassung": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "FERNAUSLESBAR", + "MANUELL_AUSGELESENE" + ] + } + }, + "required": [ + "zaehlernummer", + "sparte", + "zaehlerauspraegung", + "zaehlertyp", + "tarifart", + "zaehlwerke" + ] + }, + "Zaehlwerk": { + "type": [ + "object", + "null" + ], + "properties": { + "zaehlwerkId": { + "type": "string" + }, + "bezeichnung": { + "type": "string" + }, + "richtung": { + "type": "string", + "enum": [ + "AUSSP", + "EINSP" + ] + }, + "obisKennzahl": { + "type": "string" + }, + "wandlerfaktor": { + "type": "number" + }, + "einheit": { + "type": "string", + "enum": [ + "WH", + "KW", + "ANZAHL", + "KUBIKMETER", + "STUNDE", + "TAG", + "MONAT", + "VAR", + "VARH", + "JAHR", + "KWH", + "MW", + "KVAR", + "KVARH", + "MWH" + ] + }, + "kennzahl": { + "type": [ + "string", + "null" + ] + }, + "schwachlastfaehig": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "NICHT_SCHWACHLASTFAEHIG", + "SCHWACHLASTFAEHIG" + ] + }, + "verwendungszwecke": { + "type": [ + "array", + "null" + ], + "items": { + "type": "string", + "enum": [ + "NETZNUTZUNGSABRECHNUNG", + "BILANZKREISABRECHNUNG", + "MEHRMINDERMBENGENABRECHNUNG", + "ENDKUNDENABRECHNUNG" + ] + } + }, + "verbrauchsart": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "KL", + "KLW", + "KLWS", + "W", + "WS" + ] + }, + "unterbrechbarkeit": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "UV", + "NUV" + ] + }, + "waermenutzung": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "SPEICHERHEIZUNG", + "WAERMEPUMPE", + "DIREKTHEIZUNG" + ] + }, + "konzessionsabgabe": { + "$ref": "#/definitions/Konzessionsabgabe" + }, + "steuerbefreit": { + "type": [ + "boolean", + "null" + ] + }, + "vorkommastelle": { + "type": [ + "integer", + "null" + ] + }, + "nachkommastelle": { + "type": [ + "integer", + "null" + ] + }, + "guid": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "zaehlwerkId", + "bezeichnung", + "richtung", + "obisKennzahl", + "wandlerfaktor", + "einheit" + ] + } + }, + "type": "object", + "properties": { + "guid": { + "type": [ + "string", + "null" + ] + }, + "boTyp": { + "type": [ + "string", + "null" + ] + }, + "versionStruktur": { + "type": "integer" + }, + "marktlokationsId": { + "type": "string", + "default": "|null|" + }, + "sparte": { + "type": "string", + "enum": [ + "STROM", + "GAS", + "FERNWAERME", + "NAHWAERME", + "WASSER", + "ABWASSER" + ] + }, + "energierichtung": { + "type": "string", + "enum": [ + "AUSSP", + "EINSP" + ] + }, + "bilanzierungsmethode": { + "type": "string", + "enum": [ + "RLM", + "SLP", + "TLP_GEMEINSAM", + "TLP_GETRENNT", + "PAUSCHAL", + "IMS" + ] + }, + "verbrauchsart": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "KL", + "KLW", + "KLWS", + "W", + "WS" + ] + }, + "unterbrechbar": { + "type": [ + "boolean", + "null" + ] + }, + "netzebene": { + "type": "string", + "enum": [ + "NSP", + "MSP", + "HSP", + "HSS", + "MSP_NSP_UMSP", + "HSP_MSP_UMSP", + "HSS_HSP_UMSP", + "HD", + "MD", + "ND" + ] + }, + "netzbetreiberCodeNr": { + "type": [ + "string", + "null" + ] + }, + "gebietTyp": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "REGELZONE", + "MARKTGEBIET", + "BILANZIERUNGSGEBIET", + "VERTEILNETZ", + "TRANSPORTNETZ", + "REGIONALNETZ", + "AREALNETZ", + "GRUNDVERSORGUNGSGEBIET", + "VERSORGUNGSGEBIET" + ] + }, + "netzgebietNr": { + "type": [ + "string", + "null" + ] + }, + "bilanzierungsgebiet": { + "type": [ + "string", + "null" + ] + }, + "grundversorgerCodeNr": { + "type": [ + "string", + "null" + ] + }, + "gasqualitaet": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "H_GAS", + "H_GAS", + "L_GAS", + "L_GAS" + ] + }, + "endkunde": { + "$ref": "#/definitions/Geschaeftspartner" + }, + "lokationsadresse": { + "$ref": "#/definitions/Adresse" + }, + "geoadresse": { + "$ref": "#/definitions/Geokoordinaten" + }, + "katasterinformation": { + "$ref": "#/definitions/Katasteradresse" + }, + "marktrollen": { + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Marktrolle" + } + }, + "regelzone": { + "type": [ + "string", + "null" + ] + }, + "marktgebiet": { + "type": [ + "string", + "null" + ] + }, + "zeitreihentyp": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "EGS", + "LGS", + "NZR", + "SES", + "SLS", + "TES", + "TLS" + ] + }, + "zaehlwerke": { + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Zaehlwerk" + } + }, + "verbauchsmenge": { + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Verbrauch" + } + }, + "messlokationen": { + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Messlokation" + } + }, + "zugehoerigeMesslokationen": { + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Messlokationszuordnung" + } + } + }, + "required": [ + "marktlokationsId", + "sparte", + "energierichtung", + "bilanzierungsmethode", + "netzebene" + ] +} \ No newline at end of file diff --git a/json-schema-files/BO4E.BO.Marktteilnehmer.json b/json-schema-files/BO4E.BO.Marktteilnehmer.json new file mode 100644 index 00000000..7bf74cd6 --- /dev/null +++ b/json-schema-files/BO4E.BO.Marktteilnehmer.json @@ -0,0 +1,817 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "definitions": { + "Adresse": { + "type": [ + "object", + "null" + ], + "properties": { + "postleitzahl": { + "type": "string" + }, + "ort": { + "type": "string" + }, + "strasse": { + "type": [ + "string", + "null" + ] + }, + "hausnummer": { + "type": [ + "string", + "null" + ] + }, + "postfach": { + "type": [ + "string", + "null" + ] + }, + "adresszusatz": { + "type": [ + "string", + "null" + ] + }, + "coErgaenzung": { + "type": [ + "string", + "null" + ] + }, + "landescode": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "AC", + "AD", + "AE", + "AF", + "AG", + "AI", + "AL", + "AM", + "AN", + "AO", + "AQ", + "AR", + "AS", + "AT", + "AU", + "AW", + "AX", + "AZ", + "BA", + "BB", + "BD", + "BE", + "BF", + "BG", + "BH", + "BI", + "BJ", + "BL", + "BM", + "BN", + "BO", + "BQ", + "BR", + "BS", + "BT", + "BU", + "BV", + "BW", + "BY", + "BZ", + "CA", + "CC", + "CD", + "CF", + "CG", + "CH", + "CI", + "CK", + "CL", + "CM", + "CN", + "CO", + "CP", + "CR", + "CS", + "CU", + "CV", + "CW", + "CX", + "CY", + "CZ", + "DE", + "DG", + "DJ", + "DK", + "DM", + "DO", + "DZ", + "EA", + "EC", + "EE", + "EG", + "EH", + "ER", + "ES", + "ET", + "EU", + "FI", + "FJ", + "FK", + "FM", + "FO", + "FR", + "FX", + "GA", + "GB", + "GD", + "GE", + "GF", + "GG", + "GH", + "GI", + "GL", + "GM", + "GN", + "GP", + "GQ", + "GR", + "GS", + "GT", + "GU", + "GW", + "GY", + "HK", + "HM", + "HN", + "HR", + "HT", + "HU", + "IC", + "ID", + "IE", + "IL", + "IM", + "IN", + "IO", + "IQ", + "IR", + "IS", + "IT", + "JE", + "JM", + "JO", + "JP", + "KE", + "KG", + "KH", + "KI", + "KM", + "KN", + "KP", + "KR", + "KW", + "KY", + "KZ", + "LA", + "LB", + "LC", + "LI", + "LK", + "LR", + "LS", + "LT", + "LU", + "LV", + "LY", + "MA", + "MC", + "MD", + "ME", + "MF", + "MG", + "MH", + "MK", + "ML", + "MM", + "MN", + "MO", + "MP", + "MQ", + "MR", + "MS", + "MT", + "MU", + "MV", + "MW", + "MX", + "MY", + "MZ", + "NA", + "NC", + "NE", + "NF", + "NG", + "NI", + "NL", + "NO", + "NP", + "NR", + "NT", + "NU", + "NZ", + "OM", + "PA", + "PE", + "PF", + "PG", + "PH", + "PK", + "PL", + "PM", + "PN", + "PR", + "PS", + "PT", + "PW", + "PY", + "QA", + "RE", + "RO", + "RS", + "RU", + "RW", + "SA", + "SB", + "SC", + "SD", + "SE", + "SF", + "SG", + "SH", + "SI", + "SJ", + "SK", + "SL", + "SM", + "SN", + "SO", + "SR", + "SS", + "ST", + "SU", + "SV", + "SX", + "SY", + "SZ", + "TA", + "TC", + "TD", + "TF", + "TG", + "TJ", + "TK", + "TL", + "TM", + "TN", + "TO", + "TP", + "TR", + "TT", + "TV", + "TW", + "TZ", + "UA", + "UG", + "UK", + "UM", + "US", + "UY", + "UZ", + "VA", + "VC", + "VE", + "VG", + "VI", + "VN", + "VU", + "WF", + "WS", + "XK", + "YE", + "YT", + "YU", + "ZA", + "ZM", + "ZR", + "ZW" + ] + }, + "guid": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "postleitzahl", + "ort" + ] + }, + "Ansprechpartner": { + "type": [ + "object", + "null" + ], + "properties": { + "guid": { + "type": [ + "string", + "null" + ] + }, + "boTyp": { + "type": [ + "string", + "null" + ] + }, + "versionStruktur": { + "type": "integer" + }, + "anrede": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "HERR", + "FRAU", + "EHELEUTE", + "FIRMA", + "INDIVIDUELL", + "DR" + ] + }, + "individuelleAnrede": { + "type": [ + "string", + "null" + ] + }, + "titel": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "DR", + "PROF", + "PROF_DR" + ] + }, + "vorname": { + "type": [ + "string", + "null" + ] + }, + "nachname": { + "type": "string" + }, + "eMailAdresse": { + "type": [ + "string", + "null" + ] + }, + "kommentar": { + "type": [ + "string", + "null" + ] + }, + "geschaeftspartner": { + "$ref": "#/definitions/Geschaeftspartner" + }, + "adresse": { + "$ref": "#/definitions/Adresse" + }, + "rufnummer": { + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Rufnummer" + } + }, + "zustaendigkeit": { + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Zustaendigkeit" + } + } + }, + "required": [ + "nachname", + "geschaeftspartner" + ] + }, + "Geschaeftspartner": { + "type": "object", + "properties": { + "guid": { + "type": [ + "string", + "null" + ] + }, + "boTyp": { + "type": [ + "string", + "null" + ] + }, + "versionStruktur": { + "type": "integer" + }, + "anrede": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "HERR", + "FRAU", + "EHELEUTE", + "FIRMA", + "INDIVIDUELL", + "DR" + ] + }, + "title": { + "type": [ + "string", + "null" + ] + }, + "name1": { + "type": [ + "string", + "null" + ] + }, + "name2": { + "type": [ + "string", + "null" + ] + }, + "name3": { + "type": [ + "string", + "null" + ] + }, + "gewerbekennzeichnung": { + "type": "boolean" + }, + "hrnummer": { + "type": [ + "string", + "null" + ] + }, + "amtsgericht": { + "type": [ + "string", + "null" + ] + }, + "kontaktweg": { + "type": [ + "array", + "null" + ], + "items": { + "type": "string", + "enum": [ + "ANSCHREIBEN", + "TELEFONAT", + "FAX", + "E_MAIL", + "SMS" + ] + } + }, + "umsatzsteuerId": { + "type": [ + "string", + "null" + ] + }, + "glaeubigerId": { + "type": [ + "string", + "null" + ] + }, + "eMailAdresse": { + "type": [ + "string", + "null" + ] + }, + "website": { + "type": [ + "string", + "null" + ] + }, + "geschaeftspartnerrolle": { + "type": [ + "array", + "null" + ], + "items": { + "type": "string", + "enum": [ + "LIEFERANT", + "DIENSTLEISTER", + "KUNDE", + "INTERESSENT", + "MARKTPARTNER" + ] + } + }, + "partneradresse": { + "$ref": "#/definitions/Adresse" + } + }, + "required": [ + "gewerbekennzeichnung" + ] + }, + "Rufnummer": { + "type": [ + "object", + "null" + ], + "properties": { + "nummerntyp": { + "type": "string", + "enum": [ + "RUF_ZENTRALE", + "FAX_ZENTRALE", + "SAMMELRUF", + "SAMMELFAX", + "ABTEILUNGRUF", + "ABTEILUNGFAX", + "RUF_DURCHWAHL", + "FAX_DURCHWAHL", + "MOBIL_NUMMER" + ] + }, + "rufnummer": { + "type": "string" + }, + "guid": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "nummerntyp", + "rufnummer" + ] + }, + "Zustaendigkeit": { + "type": [ + "object", + "null" + ], + "properties": { + "jobtitel": { + "type": [ + "string", + "null" + ] + }, + "abteilung": { + "type": [ + "string", + "null" + ] + }, + "themengebiet": { + "type": [ + "string", + "null" + ] + }, + "guid": { + "type": [ + "string", + "null" + ] + } + } + } + }, + "type": "object", + "properties": { + "guid": { + "type": [ + "string", + "null" + ] + }, + "boTyp": { + "type": [ + "string", + "null" + ] + }, + "versionStruktur": { + "type": "integer" + }, + "anrede": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "HERR", + "FRAU", + "EHELEUTE", + "FIRMA", + "INDIVIDUELL", + "DR" + ] + }, + "title": { + "type": [ + "string", + "null" + ] + }, + "name1": { + "type": [ + "string", + "null" + ] + }, + "name2": { + "type": [ + "string", + "null" + ] + }, + "name3": { + "type": [ + "string", + "null" + ] + }, + "gewerbekennzeichnung": { + "type": "boolean" + }, + "hrnummer": { + "type": [ + "string", + "null" + ] + }, + "amtsgericht": { + "type": [ + "string", + "null" + ] + }, + "kontaktweg": { + "type": [ + "array", + "null" + ], + "items": { + "type": "string", + "enum": [ + "ANSCHREIBEN", + "TELEFONAT", + "FAX", + "E_MAIL", + "SMS" + ] + } + }, + "umsatzsteuerId": { + "type": [ + "string", + "null" + ] + }, + "glaeubigerId": { + "type": [ + "string", + "null" + ] + }, + "eMailAdresse": { + "type": [ + "string", + "null" + ] + }, + "website": { + "type": [ + "string", + "null" + ] + }, + "geschaeftspartnerrolle": { + "type": [ + "array", + "null" + ], + "items": { + "type": "string", + "enum": [ + "LIEFERANT", + "DIENSTLEISTER", + "KUNDE", + "INTERESSENT", + "MARKTPARTNER" + ] + } + }, + "partneradresse": { + "$ref": "#/definitions/Adresse" + }, + "marktrolle": { + "type": "string", + "enum": [ + "NB", + "LF", + "MSB", + "MDL", + "DL", + "BKV", + "BIKO", + "UENB", + "KUNDE_SELBST_NN", + "MGV", + "EIV", + "RB", + "KUNDE", + "INTERESSENT" + ] + }, + "rollencodenummer": { + "type": "string" + }, + "rollencodetyp": { + "type": "string", + "enum": [ + "BDEW", + "DVGW", + "GLN" + ] + }, + "makoadresse": { + "type": "string" + }, + "ansprechpartner": { + "$ref": "#/definitions/Ansprechpartner" + } + }, + "required": [ + "gewerbekennzeichnung", + "marktrolle", + "rollencodenummer", + "rollencodetyp", + "makoadresse" + ] +} \ No newline at end of file diff --git a/json-schema-files/BO4E.BO.Messlokation.json b/json-schema-files/BO4E.BO.Messlokation.json new file mode 100644 index 00000000..36a9abd8 --- /dev/null +++ b/json-schema-files/BO4E.BO.Messlokation.json @@ -0,0 +1,1329 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "definitions": { + "Adresse": { + "type": [ + "object", + "null" + ], + "properties": { + "postleitzahl": { + "type": "string" + }, + "ort": { + "type": "string" + }, + "strasse": { + "type": [ + "string", + "null" + ] + }, + "hausnummer": { + "type": [ + "string", + "null" + ] + }, + "postfach": { + "type": [ + "string", + "null" + ] + }, + "adresszusatz": { + "type": [ + "string", + "null" + ] + }, + "coErgaenzung": { + "type": [ + "string", + "null" + ] + }, + "landescode": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "AC", + "AD", + "AE", + "AF", + "AG", + "AI", + "AL", + "AM", + "AN", + "AO", + "AQ", + "AR", + "AS", + "AT", + "AU", + "AW", + "AX", + "AZ", + "BA", + "BB", + "BD", + "BE", + "BF", + "BG", + "BH", + "BI", + "BJ", + "BL", + "BM", + "BN", + "BO", + "BQ", + "BR", + "BS", + "BT", + "BU", + "BV", + "BW", + "BY", + "BZ", + "CA", + "CC", + "CD", + "CF", + "CG", + "CH", + "CI", + "CK", + "CL", + "CM", + "CN", + "CO", + "CP", + "CR", + "CS", + "CU", + "CV", + "CW", + "CX", + "CY", + "CZ", + "DE", + "DG", + "DJ", + "DK", + "DM", + "DO", + "DZ", + "EA", + "EC", + "EE", + "EG", + "EH", + "ER", + "ES", + "ET", + "EU", + "FI", + "FJ", + "FK", + "FM", + "FO", + "FR", + "FX", + "GA", + "GB", + "GD", + "GE", + "GF", + "GG", + "GH", + "GI", + "GL", + "GM", + "GN", + "GP", + "GQ", + "GR", + "GS", + "GT", + "GU", + "GW", + "GY", + "HK", + "HM", + "HN", + "HR", + "HT", + "HU", + "IC", + "ID", + "IE", + "IL", + "IM", + "IN", + "IO", + "IQ", + "IR", + "IS", + "IT", + "JE", + "JM", + "JO", + "JP", + "KE", + "KG", + "KH", + "KI", + "KM", + "KN", + "KP", + "KR", + "KW", + "KY", + "KZ", + "LA", + "LB", + "LC", + "LI", + "LK", + "LR", + "LS", + "LT", + "LU", + "LV", + "LY", + "MA", + "MC", + "MD", + "ME", + "MF", + "MG", + "MH", + "MK", + "ML", + "MM", + "MN", + "MO", + "MP", + "MQ", + "MR", + "MS", + "MT", + "MU", + "MV", + "MW", + "MX", + "MY", + "MZ", + "NA", + "NC", + "NE", + "NF", + "NG", + "NI", + "NL", + "NO", + "NP", + "NR", + "NT", + "NU", + "NZ", + "OM", + "PA", + "PE", + "PF", + "PG", + "PH", + "PK", + "PL", + "PM", + "PN", + "PR", + "PS", + "PT", + "PW", + "PY", + "QA", + "RE", + "RO", + "RS", + "RU", + "RW", + "SA", + "SB", + "SC", + "SD", + "SE", + "SF", + "SG", + "SH", + "SI", + "SJ", + "SK", + "SL", + "SM", + "SN", + "SO", + "SR", + "SS", + "ST", + "SU", + "SV", + "SX", + "SY", + "SZ", + "TA", + "TC", + "TD", + "TF", + "TG", + "TJ", + "TK", + "TL", + "TM", + "TN", + "TO", + "TP", + "TR", + "TT", + "TV", + "TW", + "TZ", + "UA", + "UG", + "UK", + "UM", + "US", + "UY", + "UZ", + "VA", + "VC", + "VE", + "VG", + "VI", + "VN", + "VU", + "WF", + "WS", + "XK", + "YE", + "YT", + "YU", + "ZA", + "ZM", + "ZR", + "ZW" + ] + }, + "guid": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "postleitzahl", + "ort" + ] + }, + "Dienstleistung": { + "type": [ + "object", + "null" + ], + "properties": { + "dienstleistungstyp": { + "type": "string", + "enum": [ + "DATENBEREITSTELLUNG_TAEGLICH", + "DATENBEREITSTELLUNG_WOECHENTLICH", + "DATENBEREITSTELLUNG_MONATLICH", + "DATENBEREITSTELLUNG_JAEHRLICH", + "DATENBEREITSTELLUNG_HISTORISCHE_LG", + "DATENBEREITSTELLUNG_STUENDLICH", + "DATENBEREITSTELLUNG_VIERTELJAEHRLICH", + "DATENBEREITSTELLUNG_HALBJAEHRLICH", + "DATENBEREITSTELLUNG_MONATLICH_ZUSAETZLICH", + "DATENBEREITSTELLUNG_EINMALIG", + "AUSLESUNG_2X_TAEGLICH_FERNAUSLESUNG", + "AUSLESUNG_TAEGLICH_FERNAUSLESUNG", + "AUSLESUNG_LGK_MANUELL_MSB", + "AUSLESUNG_MONATLICH_SLP_FERNAUSLESUNG", + "AUSLESUNG_JAEHRLICH_SLP_FERNAUSLESUNG", + "AUSLESUNG_MDE_SLP", + "ABLESUNG_MONATLICH_SLP", + "ABLESUNG_VIERTELJAEHRLICH_SLP", + "ABLESUNG_HALBJAEHRLICH_SLP", + "ABLESUNG_JAEHRLICH_SLP", + "AUSLESUNG_SLP_FERNAUSLESUNG", + "ABLESUNG_SLP_ZUSAETZLICH_MSB", + "ABLESUNG_SLP_ZUSAETZLICH_KUNDE", + "AUSLESUNG_LGK_FERNAUSLESUNG_ZUSAETZLICH_MSB", + "AUSLESUNG_MOATLICH_FERNAUSLESUNG", + "AUSLESUNG_STUENDLICH_FERNAUSLESUNG", + "ABLESUNG_MONATLICH_LGK", + "AUSLESUNG_TEMERATURMENGENUMWERTER", + "AUSLESUNG_ZUSTANDSMENGENUMWERTER", + "AUSLESUNG_SYSTEMMENGENUMWERTER", + "AUSLESUNG_VORGANG_SLP", + "AUSLESUUNG_KOMPAKTMENGENUMWERTER", + "AUSLESUNG_MDE_LGK", + "SPERRUNG_SLP", + "ENTSPERRUNG_SLP", + "SPERRUNG_RLM", + "ENTSPERRUNG_RLM", + "MAHNKOSTEN", + "INKASSOKOSTEN" + ] + }, + "bezeichnung": { + "type": "string" + }, + "guid": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "dienstleistungstyp", + "bezeichnung" + ] + }, + "Geokoordinaten": { + "type": [ + "object", + "null" + ], + "properties": { + "breitengrad": { + "type": "number" + }, + "laengengrad": { + "type": "number" + }, + "guid": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "breitengrad", + "laengengrad" + ] + }, + "Geraeteeigenschaften": { + "type": [ + "object", + "null" + ], + "properties": { + "geraetetyp": { + "type": "string", + "enum": [ + "WECHSELSTROMZAEHLER", + "DREHSTROMZAEHLER", + "ZWEIRICHTUNGSZAEHLER", + "RLM_ZAEHLER", + "IMS_ZAEHLER", + "BALGENGASZAEHLER", + "MAXIMUMZAEHLER", + "MULTIPLEXANLAGE", + "PAUSCHALANLAGE", + "VERSTAERKERANLAGE", + "SUMMATIONSGERAET", + "IMPULSGEBER", + "EDL_21_ZAEHLERAUFSATZ", + "VIER_QUADRANTEN_LASTGANGZAEHLER", + "MENGENUMWERTER", + "STROMWANDLER", + "SPANNUNGSWANDLER", + "DATENLOGGER", + "KOMMUNIKATIONSANSCHLUSS", + "MODEM", + "TELEKOMMUNIKATIONSEINRICHTUNG", + "DREHKOLBENGASZAEHLER", + "TURBINENRADGASZAEHLER", + "ULTRASCHALLZAEHLER", + "WIRBELGASZAEHLER", + "MODERNE_MESSEINRICHTUNG", + "ELEKTRONISCHER_HAUSHALTSZAEHLER", + "STEUEREINRICHTUNG", + "TECHNISCHESTEUEREINRICHTUNG", + "TARIFSCHALTGERAET", + "RUNDSTEUEREMPFAENGER", + "OPTIONALE_ZUS_ZAEHLEINRICHTUNG", + "MESSWANDLERSATZ_IMS_MME", + "KOMBIMESSWANDLER_IMS_MME", + "TARIFSCHALTGERAET_IMS_MME", + "RUNDSTEUEREMPFAENGER_IMS_MME", + "TEMPERATUR_KOMPENSATION", + "HOECHSTBELASTUNGS_ANZEIGER", + "SONSTIGES_GERAET", + "SMARTMETERGATEWAY", + "STEUERBOX", + "BLOCKSTROMWANDLER", + "KOMBIMESSWANDLER" + ] + }, + "geraetemerkmal": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "EINTARIF", + "ZWEITARIF", + "MEHRTARIF", + "GAS_G2_5", + "GAS_G4", + "GAS_G6", + "GAS_G10", + "GAS_G16", + "GAS_G25", + "GAS_G40", + "GAS_G65", + "GAS_G100", + "GAS_G160", + "GAS_G250", + "GAS_G400", + "GAS_G650", + "GAS_G1000", + "GAS_G1600", + "GAS_G2500", + "IMPULSGEBER_G4_G100", + "IMPULSGEBER_G100", + "MODEM_GSM", + "MODEM_GPRS", + "MODEM_FUNK", + "MODEM_GSM_O_LG", + "MODEM_GSM_M_LG", + "MODEM_FESTNETZ", + "MODEM_GPRS_M_LG", + "PLC_COM", + "ETHERNET_KOM", + "DSL_KOM", + "LTE_KOM", + "RUNDSTEUEREMPFAENGER", + "TARIFSCHALTGERAET", + "ZUSTANDS_MU", + "TEMPERATUR_MU", + "KOMPAKT_MU", + "SYSTEM_MU" + ] + }, + "parameter": { + "type": [ + "object", + "null" + ], + "additionalProperties": { + "type": [ + "string", + "null" + ] + } + }, + "guid": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "geraetetyp" + ] + }, + "Geschaeftspartner": { + "type": [ + "object", + "null" + ], + "properties": { + "guid": { + "type": [ + "string", + "null" + ] + }, + "boTyp": { + "type": [ + "string", + "null" + ] + }, + "versionStruktur": { + "type": "integer" + }, + "anrede": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "HERR", + "FRAU", + "EHELEUTE", + "FIRMA", + "INDIVIDUELL", + "DR" + ] + }, + "title": { + "type": [ + "string", + "null" + ] + }, + "name1": { + "type": [ + "string", + "null" + ] + }, + "name2": { + "type": [ + "string", + "null" + ] + }, + "name3": { + "type": [ + "string", + "null" + ] + }, + "gewerbekennzeichnung": { + "type": "boolean" + }, + "hrnummer": { + "type": [ + "string", + "null" + ] + }, + "amtsgericht": { + "type": [ + "string", + "null" + ] + }, + "kontaktweg": { + "type": [ + "array", + "null" + ], + "items": { + "type": "string", + "enum": [ + "ANSCHREIBEN", + "TELEFONAT", + "FAX", + "E_MAIL", + "SMS" + ] + } + }, + "umsatzsteuerId": { + "type": [ + "string", + "null" + ] + }, + "glaeubigerId": { + "type": [ + "string", + "null" + ] + }, + "eMailAdresse": { + "type": [ + "string", + "null" + ] + }, + "website": { + "type": [ + "string", + "null" + ] + }, + "geschaeftspartnerrolle": { + "type": [ + "array", + "null" + ], + "items": { + "type": "string", + "enum": [ + "LIEFERANT", + "DIENSTLEISTER", + "KUNDE", + "INTERESSENT", + "MARKTPARTNER" + ] + } + }, + "partneradresse": { + "$ref": "#/definitions/Adresse" + } + }, + "required": [ + "gewerbekennzeichnung" + ] + }, + "Hardware": { + "type": [ + "object", + "null" + ], + "properties": { + "geraetetyp": { + "type": "string", + "enum": [ + "WECHSELSTROMZAEHLER", + "DREHSTROMZAEHLER", + "ZWEIRICHTUNGSZAEHLER", + "RLM_ZAEHLER", + "IMS_ZAEHLER", + "BALGENGASZAEHLER", + "MAXIMUMZAEHLER", + "MULTIPLEXANLAGE", + "PAUSCHALANLAGE", + "VERSTAERKERANLAGE", + "SUMMATIONSGERAET", + "IMPULSGEBER", + "EDL_21_ZAEHLERAUFSATZ", + "VIER_QUADRANTEN_LASTGANGZAEHLER", + "MENGENUMWERTER", + "STROMWANDLER", + "SPANNUNGSWANDLER", + "DATENLOGGER", + "KOMMUNIKATIONSANSCHLUSS", + "MODEM", + "TELEKOMMUNIKATIONSEINRICHTUNG", + "DREHKOLBENGASZAEHLER", + "TURBINENRADGASZAEHLER", + "ULTRASCHALLZAEHLER", + "WIRBELGASZAEHLER", + "MODERNE_MESSEINRICHTUNG", + "ELEKTRONISCHER_HAUSHALTSZAEHLER", + "STEUEREINRICHTUNG", + "TECHNISCHESTEUEREINRICHTUNG", + "TARIFSCHALTGERAET", + "RUNDSTEUEREMPFAENGER", + "OPTIONALE_ZUS_ZAEHLEINRICHTUNG", + "MESSWANDLERSATZ_IMS_MME", + "KOMBIMESSWANDLER_IMS_MME", + "TARIFSCHALTGERAET_IMS_MME", + "RUNDSTEUEREMPFAENGER_IMS_MME", + "TEMPERATUR_KOMPENSATION", + "HOECHSTBELASTUNGS_ANZEIGER", + "SONSTIGES_GERAET", + "SMARTMETERGATEWAY", + "STEUERBOX", + "BLOCKSTROMWANDLER", + "KOMBIMESSWANDLER" + ] + }, + "bezeichnung": { + "type": "string" + }, + "geraeteeigenschaften": { + "$ref": "#/definitions/Geraeteeigenschaften" + }, + "geraetenummer": { + "type": [ + "string", + "null" + ] + }, + "geraetereferenz": { + "type": [ + "string", + "null" + ] + }, + "guid": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "geraetetyp", + "bezeichnung" + ] + }, + "Katasteradresse": { + "type": [ + "object", + "null" + ], + "properties": { + "gemarkung_flur": { + "type": "string" + }, + "flurstueck": { + "type": "string" + }, + "guid": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "gemarkung_flur", + "flurstueck" + ] + }, + "Konzessionsabgabe": { + "type": [ + "object", + "null" + ], + "properties": { + "guid": { + "type": [ + "string", + "null" + ] + }, + "kosten": { + "type": "number" + }, + "kategorie": { + "type": "string" + }, + "satz": { + "type": "string", + "enum": [ + "KAS", + "SA", + "SAS", + "TA", + "TAS", + "TK", + "TKS", + "TS", + "TSS" + ] + } + }, + "required": [ + "kosten", + "kategorie", + "satz" + ] + }, + "Marktrolle": { + "type": [ + "object", + "null" + ], + "properties": { + "rollencodenummer": { + "type": [ + "string", + "null" + ] + }, + "code": { + "type": [ + "string", + "null" + ] + }, + "marktrolle": { + "type": "string", + "enum": [ + "NB", + "LF", + "MSB", + "MDL", + "DL", + "BKV", + "BIKO", + "UENB", + "KUNDE_SELBST_NN", + "MGV", + "EIV", + "RB", + "KUNDE", + "INTERESSENT" + ] + }, + "guid": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "marktrolle" + ] + }, + "Zaehler": { + "type": [ + "object", + "null" + ], + "properties": { + "guid": { + "type": [ + "string", + "null" + ] + }, + "boTyp": { + "type": [ + "string", + "null" + ] + }, + "versionStruktur": { + "type": "integer" + }, + "zaehlernummer": { + "type": "string" + }, + "sparte": { + "type": "string", + "enum": [ + "STROM", + "GAS", + "FERNWAERME", + "NAHWAERME", + "WASSER", + "ABWASSER" + ] + }, + "zaehlerauspraegung": { + "type": "string", + "enum": [ + "EINRICHTUNGSZAEHLER", + "ZWEIRICHTUNGSZAEHLER" + ] + }, + "zaehlertyp": { + "type": "string", + "enum": [ + "DREHSTROMZAEHLER", + "BALGENGASZAEHLER", + "DREHKOLBENZAEHLER", + "SMARTMETER", + "LEISTUNGSZAEHLER", + "MAXIMUMZAEHLER", + "TURBINENRADGASZAEHLER", + "ULTRASCHALLGASZAEHLER", + "WECHSELSTROMZAEHLER" + ] + }, + "tarifart": { + "type": "string", + "enum": [ + "EINTARIF", + "ZWEITARIF", + "MEHRTARIF", + "SMART_METER", + "LEISTUNGSGEMESSEN" + ] + }, + "zaehlerkonstante": { + "type": "number" + }, + "eichungBis": { + "type": [ + "string", + "null" + ], + "format": "date-time" + }, + "letzteEichung": { + "type": [ + "string", + "null" + ], + "format": "date-time" + }, + "zaehlwerke": { + "type": "array", + "items": { + "$ref": "#/definitions/Zaehlwerk" + }, + "minItems": 1 + }, + "zaehlerhersteller": { + "$ref": "#/definitions/Geschaeftspartner" + }, + "gateway": { + "type": [ + "string", + "null" + ] + }, + "fernschaltung": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "VORHANDEN", + "NICHT_VORHANDEN" + ] + }, + "messwerterfassung": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "FERNAUSLESBAR", + "MANUELL_AUSGELESENE" + ] + } + }, + "required": [ + "zaehlernummer", + "sparte", + "zaehlerauspraegung", + "zaehlertyp", + "tarifart", + "zaehlwerke" + ] + }, + "Zaehlwerk": { + "type": [ + "object", + "null" + ], + "properties": { + "zaehlwerkId": { + "type": "string" + }, + "bezeichnung": { + "type": "string" + }, + "richtung": { + "type": "string", + "enum": [ + "AUSSP", + "EINSP" + ] + }, + "obisKennzahl": { + "type": "string" + }, + "wandlerfaktor": { + "type": "number" + }, + "einheit": { + "type": "string", + "enum": [ + "WH", + "KW", + "ANZAHL", + "KUBIKMETER", + "STUNDE", + "TAG", + "MONAT", + "VAR", + "VARH", + "JAHR", + "KWH", + "MW", + "KVAR", + "KVARH", + "MWH" + ] + }, + "kennzahl": { + "type": [ + "string", + "null" + ] + }, + "schwachlastfaehig": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "NICHT_SCHWACHLASTFAEHIG", + "SCHWACHLASTFAEHIG" + ] + }, + "verwendungszwecke": { + "type": [ + "array", + "null" + ], + "items": { + "type": "string", + "enum": [ + "NETZNUTZUNGSABRECHNUNG", + "BILANZKREISABRECHNUNG", + "MEHRMINDERMBENGENABRECHNUNG", + "ENDKUNDENABRECHNUNG" + ] + } + }, + "verbrauchsart": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "KL", + "KLW", + "KLWS", + "W", + "WS" + ] + }, + "unterbrechbarkeit": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "UV", + "NUV" + ] + }, + "waermenutzung": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "SPEICHERHEIZUNG", + "WAERMEPUMPE", + "DIREKTHEIZUNG" + ] + }, + "konzessionsabgabe": { + "$ref": "#/definitions/Konzessionsabgabe" + }, + "steuerbefreit": { + "type": [ + "boolean", + "null" + ] + }, + "vorkommastelle": { + "type": [ + "integer", + "null" + ] + }, + "nachkommastelle": { + "type": [ + "integer", + "null" + ] + }, + "guid": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "zaehlwerkId", + "bezeichnung", + "richtung", + "obisKennzahl", + "wandlerfaktor", + "einheit" + ] + } + }, + "type": "object", + "properties": { + "guid": { + "type": [ + "string", + "null" + ] + }, + "boTyp": { + "type": [ + "string", + "null" + ] + }, + "versionStruktur": { + "type": "integer" + }, + "messLokationsId": { + "type": "string", + "default": "|null|" + }, + "sparte": { + "type": "string", + "enum": [ + "STROM", + "GAS", + "FERNWAERME", + "NAHWAERME", + "WASSER", + "ABWASSER" + ] + }, + "netzebeneMessung": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "NSP", + "MSP", + "HSP", + "HSS", + "MSP_NSP_UMSP", + "HSP_MSP_UMSP", + "HSS_HSP_UMSP", + "HD", + "MD", + "ND" + ] + }, + "messgebietNr": { + "type": [ + "string", + "null" + ] + }, + "grundzustaendigerMSBCodeNr": { + "type": [ + "string", + "null" + ] + }, + "grundzustaendigerMSBIMCodeNr": { + "type": [ + "string", + "null" + ] + }, + "grundzustaendigerMDLodeNr": { + "type": [ + "string", + "null" + ] + }, + "messadresse": { + "$ref": "#/definitions/Adresse" + }, + "geoadresse": { + "$ref": "#/definitions/Geokoordinaten" + }, + "katasterinformation": { + "$ref": "#/definitions/Katasteradresse" + }, + "geraete": { + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Hardware" + } + }, + "messdienstleistung": { + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Dienstleistung" + } + }, + "messlokationszaehler": { + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Zaehler" + } + }, + "bilanzierungsmethode": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "RLM", + "SLP", + "TLP_GEMEINSAM", + "TLP_GETRENNT", + "PAUSCHAL", + "IMS" + ] + }, + "abrechnungmessstellenbetriebnna": { + "type": [ + "boolean", + "null" + ] + }, + "marktrollen": { + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Marktrolle" + } + }, + "gasqualitaet": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "H_GAS", + "H_GAS", + "L_GAS", + "L_GAS" + ] + }, + "verlustfaktor": { + "type": [ + "number", + "null" + ] + } + }, + "required": [ + "messLokationsId", + "sparte" + ] +} \ No newline at end of file diff --git a/json-schema-files/BO4E.BO.Preisblatt.json b/json-schema-files/BO4E.BO.Preisblatt.json new file mode 100644 index 00000000..a9b8d28d --- /dev/null +++ b/json-schema-files/BO4E.BO.Preisblatt.json @@ -0,0 +1,413 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "definitions": { + "PositionsAufAbschlag": { + "type": [ + "object", + "null" + ], + "properties": { + "bezeichnung": { + "type": "string" + }, + "beschreibung": { + "type": "string" + }, + "aufAbschlagstyp": { + "type": "string", + "enum": [ + "RELATIV", + "ABSOLUT" + ] + }, + "aufAbschlagswert": { + "type": "number" + }, + "aufAbschlagswaehrung": { + "type": "string", + "enum": [ + "EUR", + "CT" + ] + }, + "guid": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "bezeichnung", + "beschreibung", + "aufAbschlagstyp", + "aufAbschlagswert", + "aufAbschlagswaehrung" + ] + }, + "Preisposition": { + "type": [ + "object", + "null" + ], + "properties": { + "berechnungsmethode": { + "type": "string", + "enum": [ + "KEINE", + "STAFFELN", + "ZONEN", + "VORZONEN_GP", + "SIGMOID", + "BLINDARBEIT_GT_50_PROZENT", + "BLINDARBEIT_GT_40_PROZENT", + "AP_GP_ZONEN", + "LP_INSTALL_LEISTUNG", + "AP_TRANSPORT_ODER_VERTEILNETZ", + "AP_TRANSPORT_ODER_VERTEILNETZ_ORTSVERTEILNETZ_SIGMOID", + "LP_JAHRESVERBRAUCH", + "LP_TRANSPORT_ODER_VERTEILNETZ", + "LP_TRANSPORT_ODER_VERTEILNETZ_ORTSVERTEILNETZ_SIGMOID", + "FUNKTIONEN", + "VERBRAUCH_UEBER_SLP_GRENZE_FUNKTIONSBEZOGEN_WEITERE_BERECHNUNG_ALS_LGK" + ] + }, + "leistungstyp": { + "type": "string", + "enum": [ + "ARBEITSPREIS_WIRKARBEIT", + "LEISTUNGSPREIS_WIRKLEISTUNG", + "ARBEITSPREIS_BLINDARBEIT_IND", + "ARBEITSPREIS_BLINDARBEIT_KAP", + "GRUNDPREIS", + "MEHRMINDERMENGE", + "MESSSTELLENBETRIEB", + "MESSDIENSTLEISTUNG", + "MESSDIENSTLEISTUNG_INKL_MESSUNG", + "ABRECHNUNG", + "KONZESSIONS_ABGABE", + "KWK_UMLAGE", + "OFFSHORE_UMLAGE", + "ABLAV_UMLAGE", + "REGELENERGIE_UMLAGE", + "BILANZIERUNG_UMLAGE", + "AUSLESUNG_ZUSAETZLICH", + "ABLESUNG_ZUSAETZLICH", + "ABRECHNUNG_ZUSAETZLICH", + "SPERRUNG", + "ENTSPERRUNG", + "MAHNKOSTEN", + "INKASSOKOSTEN" + ] + }, + "leistungsbezeichung": { + "type": "string" + }, + "preiseinheit": { + "type": "string", + "enum": [ + "EUR", + "CT" + ] + }, + "bezugsgroesse": { + "type": "string", + "enum": [ + "WH", + "KW", + "ANZAHL", + "KUBIKMETER", + "STUNDE", + "TAG", + "MONAT", + "VAR", + "VARH", + "JAHR", + "KWH", + "MW", + "KVAR", + "KVARH", + "MWH" + ] + }, + "zeitbasis": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "SEKUNDE", + "MINUTE", + "STUNDE", + "VIERTEL_STUNDE", + "TAG", + "WOCHE", + "MONAT", + "QUARTAL", + "HALBJAHR", + "JAHR" + ] + }, + "tarifzeit": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "TZ_STANDARD", + "TZ_HT", + "TZ_NT" + ] + }, + "bdewArtikelnummer": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "LEISTUNG", + "LEISTUNG_PAUSCHAL", + "GRUNDPREIS", + "REGELENERGIE_ARBEIT", + "REGELENERGIE_LEISTUNG", + "NOTSTROMLIEFERUNG_ARBEIT", + "NOTSTROMLIEFERUNG_LEISTUNG", + "RESERVENETZKAPAZITAET", + "RESERVELEISTUNG", + "ZUSAETZLICHE_ABLESUNG", + "PRUEFGEBUEHREN_AUSSERPLANMAESSIG", + "WIRKARBEIT", + "SINGULAER_GENUTZTE_BETRIEBSMITTEL", + "ABGABE_KWKG", + "ABSCHLAG", + "KONZESSIONSABGABE", + "ENTGELT_FERNAUSLESUNG", + "UNTERMESSUNG", + "BLINDMEHRARBEIT", + "ENTGELT_ABRECHNUNG", + "SPERRKOSTEN", + "ENTSPERRKOSTEN", + "MAHNKOSTEN", + "MEHR_MINDERMENGEN", + "INKASSOKOSTEN", + "BLINDMEHRLEISTUNG", + "ENTGELT_MESSUNG_ABLESUNG", + "ENTGELT_EINBAU_BETRIEB_WARTUNG_MESSTECHNIK", + "AUSGLEICHSENERGIE", + "ZAEHLEINRICHTUNG", + "WANDLER_MENGENUMWERTER", + "KOMMUNIKATIONSEINRICHTUNG", + "TECHNISCHE_STEUEREINRICHTUNG", + "PARAGRAF_19_STROM_NEV_UMLAGE", + "BEFESTIGUNGSEINRICHTUNG", + "OFFSHORE_HAFTUNGSUMLAGE", + "FIXE_ARBEITSENTGELTKOMPONENTE", + "FIXE_LEISTUNGSENTGELTKOMPONENTE", + "UMLAGE_ABSCHALTBARE_LASTEN", + "MEHRMENGE", + "MINDERMENGE", + "ENERGIESTEUER", + "SMARTMETER_GATEWAY", + "STEUERBOX", + "MSB_INKL_MESSUNG" + ] + }, + "zonungsgroesse": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "WIRKARBEIT_EL", + "LEISTUNG_EL", + "BLINDARBEIT_KAP", + "BLINDARBEIT_IND", + "BLINDLEISTUNG_KAP", + "BLINDLEISTUNG_IND", + "WIRKARBEIT_TH", + "LEISTUNG_TH", + "VOLUMEN", + "VOLUMENSTROM", + "BENUTZUNGSDAUER", + "ANZAHL" + ] + }, + "zu_abschlaege": { + "$ref": "#/definitions/PositionsAufAbschlag" + }, + "preisstaffeln": { + "type": "array", + "items": { + "$ref": "#/definitions/Preisstaffel" + } + }, + "guid": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "berechnungsmethode", + "leistungstyp", + "leistungsbezeichung", + "preiseinheit", + "bezugsgroesse", + "preisstaffeln" + ] + }, + "Preisstaffel": { + "type": [ + "object", + "null" + ], + "properties": { + "einheitspreis": { + "type": "number" + }, + "staffelgrenzeVon": { + "type": "number" + }, + "staffelgrenzeBis": { + "type": "number" + }, + "sigmoidparameter": { + "$ref": "#/definitions/Sigmoidparameter" + }, + "guid": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "einheitspreis", + "staffelgrenzeVon", + "staffelgrenzeBis" + ] + }, + "Sigmoidparameter": { + "type": [ + "object", + "null" + ], + "properties": { + "A": { + "type": "number" + }, + "B": { + "type": "number" + }, + "C": { + "type": "number" + }, + "D": { + "type": "number" + }, + "guid": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "A", + "B", + "C", + "D" + ] + }, + "Zeitraum": { + "type": "object", + "properties": { + "einheit": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "SEKUNDE", + "MINUTE", + "STUNDE", + "VIERTEL_STUNDE", + "TAG", + "WOCHE", + "MONAT", + "QUARTAL", + "HALBJAHR", + "JAHR" + ] + }, + "dauer": { + "type": [ + "number", + "null" + ] + }, + "startdatum": { + "type": [ + "string", + "null" + ], + "format": "date-time" + }, + "enddatum": { + "type": [ + "string", + "null" + ], + "format": "date-time" + }, + "guid": { + "type": [ + "string", + "null" + ] + } + } + } + }, + "type": "object", + "properties": { + "guid": { + "type": [ + "string", + "null" + ] + }, + "boTyp": { + "type": [ + "string", + "null" + ] + }, + "versionStruktur": { + "type": "integer" + }, + "bezeichnung": { + "type": "string" + }, + "gueltigkeit": { + "$ref": "#/definitions/Zeitraum" + }, + "preispositionen": { + "type": "array", + "items": { + "$ref": "#/definitions/Preisposition" + } + } + }, + "required": [ + "bezeichnung", + "gueltigkeit", + "preispositionen" + ] +} \ No newline at end of file diff --git a/json-schema-files/BO4E.BO.PreisblattDienstleistung.json b/json-schema-files/BO4E.BO.PreisblattDienstleistung.json new file mode 100644 index 00000000..e73743b8 --- /dev/null +++ b/json-schema-files/BO4E.BO.PreisblattDienstleistung.json @@ -0,0 +1,1291 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "definitions": { + "Adresse": { + "type": [ + "object", + "null" + ], + "properties": { + "postleitzahl": { + "type": "string" + }, + "ort": { + "type": "string" + }, + "strasse": { + "type": [ + "string", + "null" + ] + }, + "hausnummer": { + "type": [ + "string", + "null" + ] + }, + "postfach": { + "type": [ + "string", + "null" + ] + }, + "adresszusatz": { + "type": [ + "string", + "null" + ] + }, + "coErgaenzung": { + "type": [ + "string", + "null" + ] + }, + "landescode": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "AC", + "AD", + "AE", + "AF", + "AG", + "AI", + "AL", + "AM", + "AN", + "AO", + "AQ", + "AR", + "AS", + "AT", + "AU", + "AW", + "AX", + "AZ", + "BA", + "BB", + "BD", + "BE", + "BF", + "BG", + "BH", + "BI", + "BJ", + "BL", + "BM", + "BN", + "BO", + "BQ", + "BR", + "BS", + "BT", + "BU", + "BV", + "BW", + "BY", + "BZ", + "CA", + "CC", + "CD", + "CF", + "CG", + "CH", + "CI", + "CK", + "CL", + "CM", + "CN", + "CO", + "CP", + "CR", + "CS", + "CU", + "CV", + "CW", + "CX", + "CY", + "CZ", + "DE", + "DG", + "DJ", + "DK", + "DM", + "DO", + "DZ", + "EA", + "EC", + "EE", + "EG", + "EH", + "ER", + "ES", + "ET", + "EU", + "FI", + "FJ", + "FK", + "FM", + "FO", + "FR", + "FX", + "GA", + "GB", + "GD", + "GE", + "GF", + "GG", + "GH", + "GI", + "GL", + "GM", + "GN", + "GP", + "GQ", + "GR", + "GS", + "GT", + "GU", + "GW", + "GY", + "HK", + "HM", + "HN", + "HR", + "HT", + "HU", + "IC", + "ID", + "IE", + "IL", + "IM", + "IN", + "IO", + "IQ", + "IR", + "IS", + "IT", + "JE", + "JM", + "JO", + "JP", + "KE", + "KG", + "KH", + "KI", + "KM", + "KN", + "KP", + "KR", + "KW", + "KY", + "KZ", + "LA", + "LB", + "LC", + "LI", + "LK", + "LR", + "LS", + "LT", + "LU", + "LV", + "LY", + "MA", + "MC", + "MD", + "ME", + "MF", + "MG", + "MH", + "MK", + "ML", + "MM", + "MN", + "MO", + "MP", + "MQ", + "MR", + "MS", + "MT", + "MU", + "MV", + "MW", + "MX", + "MY", + "MZ", + "NA", + "NC", + "NE", + "NF", + "NG", + "NI", + "NL", + "NO", + "NP", + "NR", + "NT", + "NU", + "NZ", + "OM", + "PA", + "PE", + "PF", + "PG", + "PH", + "PK", + "PL", + "PM", + "PN", + "PR", + "PS", + "PT", + "PW", + "PY", + "QA", + "RE", + "RO", + "RS", + "RU", + "RW", + "SA", + "SB", + "SC", + "SD", + "SE", + "SF", + "SG", + "SH", + "SI", + "SJ", + "SK", + "SL", + "SM", + "SN", + "SO", + "SR", + "SS", + "ST", + "SU", + "SV", + "SX", + "SY", + "SZ", + "TA", + "TC", + "TD", + "TF", + "TG", + "TJ", + "TK", + "TL", + "TM", + "TN", + "TO", + "TP", + "TR", + "TT", + "TV", + "TW", + "TZ", + "UA", + "UG", + "UK", + "UM", + "US", + "UY", + "UZ", + "VA", + "VC", + "VE", + "VG", + "VI", + "VN", + "VU", + "WF", + "WS", + "XK", + "YE", + "YT", + "YU", + "ZA", + "ZM", + "ZR", + "ZW" + ] + }, + "guid": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "postleitzahl", + "ort" + ] + }, + "Ansprechpartner": { + "type": [ + "object", + "null" + ], + "properties": { + "guid": { + "type": [ + "string", + "null" + ] + }, + "boTyp": { + "type": [ + "string", + "null" + ] + }, + "versionStruktur": { + "type": "integer" + }, + "anrede": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "HERR", + "FRAU", + "EHELEUTE", + "FIRMA", + "INDIVIDUELL", + "DR" + ] + }, + "individuelleAnrede": { + "type": [ + "string", + "null" + ] + }, + "titel": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "DR", + "PROF", + "PROF_DR" + ] + }, + "vorname": { + "type": [ + "string", + "null" + ] + }, + "nachname": { + "type": "string" + }, + "eMailAdresse": { + "type": [ + "string", + "null" + ] + }, + "kommentar": { + "type": [ + "string", + "null" + ] + }, + "geschaeftspartner": { + "$ref": "#/definitions/Geschaeftspartner" + }, + "adresse": { + "$ref": "#/definitions/Adresse" + }, + "rufnummer": { + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Rufnummer" + } + }, + "zustaendigkeit": { + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Zustaendigkeit" + } + } + }, + "required": [ + "nachname", + "geschaeftspartner" + ] + }, + "Geschaeftspartner": { + "type": "object", + "properties": { + "guid": { + "type": [ + "string", + "null" + ] + }, + "boTyp": { + "type": [ + "string", + "null" + ] + }, + "versionStruktur": { + "type": "integer" + }, + "anrede": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "HERR", + "FRAU", + "EHELEUTE", + "FIRMA", + "INDIVIDUELL", + "DR" + ] + }, + "title": { + "type": [ + "string", + "null" + ] + }, + "name1": { + "type": [ + "string", + "null" + ] + }, + "name2": { + "type": [ + "string", + "null" + ] + }, + "name3": { + "type": [ + "string", + "null" + ] + }, + "gewerbekennzeichnung": { + "type": "boolean" + }, + "hrnummer": { + "type": [ + "string", + "null" + ] + }, + "amtsgericht": { + "type": [ + "string", + "null" + ] + }, + "kontaktweg": { + "type": [ + "array", + "null" + ], + "items": { + "type": "string", + "enum": [ + "ANSCHREIBEN", + "TELEFONAT", + "FAX", + "E_MAIL", + "SMS" + ] + } + }, + "umsatzsteuerId": { + "type": [ + "string", + "null" + ] + }, + "glaeubigerId": { + "type": [ + "string", + "null" + ] + }, + "eMailAdresse": { + "type": [ + "string", + "null" + ] + }, + "website": { + "type": [ + "string", + "null" + ] + }, + "geschaeftspartnerrolle": { + "type": [ + "array", + "null" + ], + "items": { + "type": "string", + "enum": [ + "LIEFERANT", + "DIENSTLEISTER", + "KUNDE", + "INTERESSENT", + "MARKTPARTNER" + ] + } + }, + "partneradresse": { + "$ref": "#/definitions/Adresse" + } + }, + "required": [ + "gewerbekennzeichnung" + ] + }, + "Marktteilnehmer": { + "type": "object", + "properties": { + "guid": { + "type": [ + "string", + "null" + ] + }, + "boTyp": { + "type": [ + "string", + "null" + ] + }, + "versionStruktur": { + "type": "integer" + }, + "anrede": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "HERR", + "FRAU", + "EHELEUTE", + "FIRMA", + "INDIVIDUELL", + "DR" + ] + }, + "title": { + "type": [ + "string", + "null" + ] + }, + "name1": { + "type": [ + "string", + "null" + ] + }, + "name2": { + "type": [ + "string", + "null" + ] + }, + "name3": { + "type": [ + "string", + "null" + ] + }, + "gewerbekennzeichnung": { + "type": "boolean" + }, + "hrnummer": { + "type": [ + "string", + "null" + ] + }, + "amtsgericht": { + "type": [ + "string", + "null" + ] + }, + "kontaktweg": { + "type": [ + "array", + "null" + ], + "items": { + "type": "string", + "enum": [ + "ANSCHREIBEN", + "TELEFONAT", + "FAX", + "E_MAIL", + "SMS" + ] + } + }, + "umsatzsteuerId": { + "type": [ + "string", + "null" + ] + }, + "glaeubigerId": { + "type": [ + "string", + "null" + ] + }, + "eMailAdresse": { + "type": [ + "string", + "null" + ] + }, + "website": { + "type": [ + "string", + "null" + ] + }, + "geschaeftspartnerrolle": { + "type": [ + "array", + "null" + ], + "items": { + "type": "string", + "enum": [ + "LIEFERANT", + "DIENSTLEISTER", + "KUNDE", + "INTERESSENT", + "MARKTPARTNER" + ] + } + }, + "partneradresse": { + "$ref": "#/definitions/Adresse" + }, + "marktrolle": { + "type": "string", + "enum": [ + "NB", + "LF", + "MSB", + "MDL", + "DL", + "BKV", + "BIKO", + "UENB", + "KUNDE_SELBST_NN", + "MGV", + "EIV", + "RB", + "KUNDE", + "INTERESSENT" + ] + }, + "rollencodenummer": { + "type": "string" + }, + "rollencodetyp": { + "type": "string", + "enum": [ + "BDEW", + "DVGW", + "GLN" + ] + }, + "makoadresse": { + "type": "string" + }, + "ansprechpartner": { + "$ref": "#/definitions/Ansprechpartner" + } + }, + "required": [ + "gewerbekennzeichnung", + "marktrolle", + "rollencodenummer", + "rollencodetyp", + "makoadresse" + ] + }, + "PositionsAufAbschlag": { + "type": [ + "object", + "null" + ], + "properties": { + "bezeichnung": { + "type": "string" + }, + "beschreibung": { + "type": "string" + }, + "aufAbschlagstyp": { + "type": "string", + "enum": [ + "RELATIV", + "ABSOLUT" + ] + }, + "aufAbschlagswert": { + "type": "number" + }, + "aufAbschlagswaehrung": { + "type": "string", + "enum": [ + "EUR", + "CT" + ] + }, + "guid": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "bezeichnung", + "beschreibung", + "aufAbschlagstyp", + "aufAbschlagswert", + "aufAbschlagswaehrung" + ] + }, + "Preisposition": { + "type": [ + "object", + "null" + ], + "properties": { + "berechnungsmethode": { + "type": "string", + "enum": [ + "KEINE", + "STAFFELN", + "ZONEN", + "VORZONEN_GP", + "SIGMOID", + "BLINDARBEIT_GT_50_PROZENT", + "BLINDARBEIT_GT_40_PROZENT", + "AP_GP_ZONEN", + "LP_INSTALL_LEISTUNG", + "AP_TRANSPORT_ODER_VERTEILNETZ", + "AP_TRANSPORT_ODER_VERTEILNETZ_ORTSVERTEILNETZ_SIGMOID", + "LP_JAHRESVERBRAUCH", + "LP_TRANSPORT_ODER_VERTEILNETZ", + "LP_TRANSPORT_ODER_VERTEILNETZ_ORTSVERTEILNETZ_SIGMOID", + "FUNKTIONEN", + "VERBRAUCH_UEBER_SLP_GRENZE_FUNKTIONSBEZOGEN_WEITERE_BERECHNUNG_ALS_LGK" + ] + }, + "leistungstyp": { + "type": "string", + "enum": [ + "ARBEITSPREIS_WIRKARBEIT", + "LEISTUNGSPREIS_WIRKLEISTUNG", + "ARBEITSPREIS_BLINDARBEIT_IND", + "ARBEITSPREIS_BLINDARBEIT_KAP", + "GRUNDPREIS", + "MEHRMINDERMENGE", + "MESSSTELLENBETRIEB", + "MESSDIENSTLEISTUNG", + "MESSDIENSTLEISTUNG_INKL_MESSUNG", + "ABRECHNUNG", + "KONZESSIONS_ABGABE", + "KWK_UMLAGE", + "OFFSHORE_UMLAGE", + "ABLAV_UMLAGE", + "REGELENERGIE_UMLAGE", + "BILANZIERUNG_UMLAGE", + "AUSLESUNG_ZUSAETZLICH", + "ABLESUNG_ZUSAETZLICH", + "ABRECHNUNG_ZUSAETZLICH", + "SPERRUNG", + "ENTSPERRUNG", + "MAHNKOSTEN", + "INKASSOKOSTEN" + ] + }, + "leistungsbezeichung": { + "type": "string" + }, + "preiseinheit": { + "type": "string", + "enum": [ + "EUR", + "CT" + ] + }, + "bezugsgroesse": { + "type": "string", + "enum": [ + "WH", + "KW", + "ANZAHL", + "KUBIKMETER", + "STUNDE", + "TAG", + "MONAT", + "VAR", + "VARH", + "JAHR", + "KWH", + "MW", + "KVAR", + "KVARH", + "MWH" + ] + }, + "zeitbasis": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "SEKUNDE", + "MINUTE", + "STUNDE", + "VIERTEL_STUNDE", + "TAG", + "WOCHE", + "MONAT", + "QUARTAL", + "HALBJAHR", + "JAHR" + ] + }, + "tarifzeit": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "TZ_STANDARD", + "TZ_HT", + "TZ_NT" + ] + }, + "bdewArtikelnummer": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "LEISTUNG", + "LEISTUNG_PAUSCHAL", + "GRUNDPREIS", + "REGELENERGIE_ARBEIT", + "REGELENERGIE_LEISTUNG", + "NOTSTROMLIEFERUNG_ARBEIT", + "NOTSTROMLIEFERUNG_LEISTUNG", + "RESERVENETZKAPAZITAET", + "RESERVELEISTUNG", + "ZUSAETZLICHE_ABLESUNG", + "PRUEFGEBUEHREN_AUSSERPLANMAESSIG", + "WIRKARBEIT", + "SINGULAER_GENUTZTE_BETRIEBSMITTEL", + "ABGABE_KWKG", + "ABSCHLAG", + "KONZESSIONSABGABE", + "ENTGELT_FERNAUSLESUNG", + "UNTERMESSUNG", + "BLINDMEHRARBEIT", + "ENTGELT_ABRECHNUNG", + "SPERRKOSTEN", + "ENTSPERRKOSTEN", + "MAHNKOSTEN", + "MEHR_MINDERMENGEN", + "INKASSOKOSTEN", + "BLINDMEHRLEISTUNG", + "ENTGELT_MESSUNG_ABLESUNG", + "ENTGELT_EINBAU_BETRIEB_WARTUNG_MESSTECHNIK", + "AUSGLEICHSENERGIE", + "ZAEHLEINRICHTUNG", + "WANDLER_MENGENUMWERTER", + "KOMMUNIKATIONSEINRICHTUNG", + "TECHNISCHE_STEUEREINRICHTUNG", + "PARAGRAF_19_STROM_NEV_UMLAGE", + "BEFESTIGUNGSEINRICHTUNG", + "OFFSHORE_HAFTUNGSUMLAGE", + "FIXE_ARBEITSENTGELTKOMPONENTE", + "FIXE_LEISTUNGSENTGELTKOMPONENTE", + "UMLAGE_ABSCHALTBARE_LASTEN", + "MEHRMENGE", + "MINDERMENGE", + "ENERGIESTEUER", + "SMARTMETER_GATEWAY", + "STEUERBOX", + "MSB_INKL_MESSUNG" + ] + }, + "zonungsgroesse": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "WIRKARBEIT_EL", + "LEISTUNG_EL", + "BLINDARBEIT_KAP", + "BLINDARBEIT_IND", + "BLINDLEISTUNG_KAP", + "BLINDLEISTUNG_IND", + "WIRKARBEIT_TH", + "LEISTUNG_TH", + "VOLUMEN", + "VOLUMENSTROM", + "BENUTZUNGSDAUER", + "ANZAHL" + ] + }, + "zu_abschlaege": { + "$ref": "#/definitions/PositionsAufAbschlag" + }, + "preisstaffeln": { + "type": "array", + "items": { + "$ref": "#/definitions/Preisstaffel" + } + }, + "guid": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "berechnungsmethode", + "leistungstyp", + "leistungsbezeichung", + "preiseinheit", + "bezugsgroesse", + "preisstaffeln" + ] + }, + "Preisstaffel": { + "type": [ + "object", + "null" + ], + "properties": { + "einheitspreis": { + "type": "number" + }, + "staffelgrenzeVon": { + "type": "number" + }, + "staffelgrenzeBis": { + "type": "number" + }, + "sigmoidparameter": { + "$ref": "#/definitions/Sigmoidparameter" + }, + "guid": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "einheitspreis", + "staffelgrenzeVon", + "staffelgrenzeBis" + ] + }, + "Rufnummer": { + "type": [ + "object", + "null" + ], + "properties": { + "nummerntyp": { + "type": "string", + "enum": [ + "RUF_ZENTRALE", + "FAX_ZENTRALE", + "SAMMELRUF", + "SAMMELFAX", + "ABTEILUNGRUF", + "ABTEILUNGFAX", + "RUF_DURCHWAHL", + "FAX_DURCHWAHL", + "MOBIL_NUMMER" + ] + }, + "rufnummer": { + "type": "string" + }, + "guid": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "nummerntyp", + "rufnummer" + ] + }, + "Sigmoidparameter": { + "type": [ + "object", + "null" + ], + "properties": { + "A": { + "type": "number" + }, + "B": { + "type": "number" + }, + "C": { + "type": "number" + }, + "D": { + "type": "number" + }, + "guid": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "A", + "B", + "C", + "D" + ] + }, + "Zeitraum": { + "type": "object", + "properties": { + "einheit": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "SEKUNDE", + "MINUTE", + "STUNDE", + "VIERTEL_STUNDE", + "TAG", + "WOCHE", + "MONAT", + "QUARTAL", + "HALBJAHR", + "JAHR" + ] + }, + "dauer": { + "type": [ + "number", + "null" + ] + }, + "startdatum": { + "type": [ + "string", + "null" + ], + "format": "date-time" + }, + "enddatum": { + "type": [ + "string", + "null" + ], + "format": "date-time" + }, + "guid": { + "type": [ + "string", + "null" + ] + } + } + }, + "Zustaendigkeit": { + "type": [ + "object", + "null" + ], + "properties": { + "jobtitel": { + "type": [ + "string", + "null" + ] + }, + "abteilung": { + "type": [ + "string", + "null" + ] + }, + "themengebiet": { + "type": [ + "string", + "null" + ] + }, + "guid": { + "type": [ + "string", + "null" + ] + } + } + } + }, + "type": "object", + "properties": { + "guid": { + "type": [ + "string", + "null" + ] + }, + "boTyp": { + "type": [ + "string", + "null" + ] + }, + "versionStruktur": { + "type": "integer" + }, + "bezeichnung": { + "type": "string" + }, + "gueltigkeit": { + "$ref": "#/definitions/Zeitraum" + }, + "preispositionen": { + "type": "array", + "items": { + "$ref": "#/definitions/Preisposition" + } + }, + "dienstleistungsdetails": { + "type": "string", + "enum": [ + "DATENBEREITSTELLUNG_TAEGLICH", + "DATENBEREITSTELLUNG_WOECHENTLICH", + "DATENBEREITSTELLUNG_MONATLICH", + "DATENBEREITSTELLUNG_JAEHRLICH", + "DATENBEREITSTELLUNG_HISTORISCHE_LG", + "DATENBEREITSTELLUNG_STUENDLICH", + "DATENBEREITSTELLUNG_VIERTELJAEHRLICH", + "DATENBEREITSTELLUNG_HALBJAEHRLICH", + "DATENBEREITSTELLUNG_MONATLICH_ZUSAETZLICH", + "DATENBEREITSTELLUNG_EINMALIG", + "AUSLESUNG_2X_TAEGLICH_FERNAUSLESUNG", + "AUSLESUNG_TAEGLICH_FERNAUSLESUNG", + "AUSLESUNG_LGK_MANUELL_MSB", + "AUSLESUNG_MONATLICH_SLP_FERNAUSLESUNG", + "AUSLESUNG_JAEHRLICH_SLP_FERNAUSLESUNG", + "AUSLESUNG_MDE_SLP", + "ABLESUNG_MONATLICH_SLP", + "ABLESUNG_VIERTELJAEHRLICH_SLP", + "ABLESUNG_HALBJAEHRLICH_SLP", + "ABLESUNG_JAEHRLICH_SLP", + "AUSLESUNG_SLP_FERNAUSLESUNG", + "ABLESUNG_SLP_ZUSAETZLICH_MSB", + "ABLESUNG_SLP_ZUSAETZLICH_KUNDE", + "AUSLESUNG_LGK_FERNAUSLESUNG_ZUSAETZLICH_MSB", + "AUSLESUNG_MOATLICH_FERNAUSLESUNG", + "AUSLESUNG_STUENDLICH_FERNAUSLESUNG", + "ABLESUNG_MONATLICH_LGK", + "AUSLESUNG_TEMERATURMENGENUMWERTER", + "AUSLESUNG_ZUSTANDSMENGENUMWERTER", + "AUSLESUNG_SYSTEMMENGENUMWERTER", + "AUSLESUNG_VORGANG_SLP", + "AUSLESUUNG_KOMPAKTMENGENUMWERTER", + "AUSLESUNG_MDE_LGK", + "SPERRUNG_SLP", + "ENTSPERRUNG_SLP", + "SPERRUNG_RLM", + "ENTSPERRUNG_RLM", + "MAHNKOSTEN", + "INKASSOKOSTEN" + ] + }, + "geraetedetails": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "RLM", + "SLP", + "TLP_GEMEINSAM", + "TLP_GETRENNT", + "PAUSCHAL", + "IMS" + ] + }, + "herausgeber": { + "$ref": "#/definitions/Marktteilnehmer" + } + }, + "required": [ + "bezeichnung", + "gueltigkeit", + "preispositionen", + "dienstleistungsdetails", + "herausgeber" + ] +} \ No newline at end of file diff --git a/json-schema-files/BO4E.BO.PreisblattKonzessionsabgabe.json b/json-schema-files/BO4E.BO.PreisblattKonzessionsabgabe.json new file mode 100644 index 00000000..93c94a33 --- /dev/null +++ b/json-schema-files/BO4E.BO.PreisblattKonzessionsabgabe.json @@ -0,0 +1,450 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "definitions": { + "PositionsAufAbschlag": { + "type": [ + "object", + "null" + ], + "properties": { + "bezeichnung": { + "type": "string" + }, + "beschreibung": { + "type": "string" + }, + "aufAbschlagstyp": { + "type": "string", + "enum": [ + "RELATIV", + "ABSOLUT" + ] + }, + "aufAbschlagswert": { + "type": "number" + }, + "aufAbschlagswaehrung": { + "type": "string", + "enum": [ + "EUR", + "CT" + ] + }, + "guid": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "bezeichnung", + "beschreibung", + "aufAbschlagstyp", + "aufAbschlagswert", + "aufAbschlagswaehrung" + ] + }, + "Preisposition": { + "type": [ + "object", + "null" + ], + "properties": { + "berechnungsmethode": { + "type": "string", + "enum": [ + "KEINE", + "STAFFELN", + "ZONEN", + "VORZONEN_GP", + "SIGMOID", + "BLINDARBEIT_GT_50_PROZENT", + "BLINDARBEIT_GT_40_PROZENT", + "AP_GP_ZONEN", + "LP_INSTALL_LEISTUNG", + "AP_TRANSPORT_ODER_VERTEILNETZ", + "AP_TRANSPORT_ODER_VERTEILNETZ_ORTSVERTEILNETZ_SIGMOID", + "LP_JAHRESVERBRAUCH", + "LP_TRANSPORT_ODER_VERTEILNETZ", + "LP_TRANSPORT_ODER_VERTEILNETZ_ORTSVERTEILNETZ_SIGMOID", + "FUNKTIONEN", + "VERBRAUCH_UEBER_SLP_GRENZE_FUNKTIONSBEZOGEN_WEITERE_BERECHNUNG_ALS_LGK" + ] + }, + "leistungstyp": { + "type": "string", + "enum": [ + "ARBEITSPREIS_WIRKARBEIT", + "LEISTUNGSPREIS_WIRKLEISTUNG", + "ARBEITSPREIS_BLINDARBEIT_IND", + "ARBEITSPREIS_BLINDARBEIT_KAP", + "GRUNDPREIS", + "MEHRMINDERMENGE", + "MESSSTELLENBETRIEB", + "MESSDIENSTLEISTUNG", + "MESSDIENSTLEISTUNG_INKL_MESSUNG", + "ABRECHNUNG", + "KONZESSIONS_ABGABE", + "KWK_UMLAGE", + "OFFSHORE_UMLAGE", + "ABLAV_UMLAGE", + "REGELENERGIE_UMLAGE", + "BILANZIERUNG_UMLAGE", + "AUSLESUNG_ZUSAETZLICH", + "ABLESUNG_ZUSAETZLICH", + "ABRECHNUNG_ZUSAETZLICH", + "SPERRUNG", + "ENTSPERRUNG", + "MAHNKOSTEN", + "INKASSOKOSTEN" + ] + }, + "leistungsbezeichung": { + "type": "string" + }, + "preiseinheit": { + "type": "string", + "enum": [ + "EUR", + "CT" + ] + }, + "bezugsgroesse": { + "type": "string", + "enum": [ + "WH", + "KW", + "ANZAHL", + "KUBIKMETER", + "STUNDE", + "TAG", + "MONAT", + "VAR", + "VARH", + "JAHR", + "KWH", + "MW", + "KVAR", + "KVARH", + "MWH" + ] + }, + "zeitbasis": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "SEKUNDE", + "MINUTE", + "STUNDE", + "VIERTEL_STUNDE", + "TAG", + "WOCHE", + "MONAT", + "QUARTAL", + "HALBJAHR", + "JAHR" + ] + }, + "tarifzeit": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "TZ_STANDARD", + "TZ_HT", + "TZ_NT" + ] + }, + "bdewArtikelnummer": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "LEISTUNG", + "LEISTUNG_PAUSCHAL", + "GRUNDPREIS", + "REGELENERGIE_ARBEIT", + "REGELENERGIE_LEISTUNG", + "NOTSTROMLIEFERUNG_ARBEIT", + "NOTSTROMLIEFERUNG_LEISTUNG", + "RESERVENETZKAPAZITAET", + "RESERVELEISTUNG", + "ZUSAETZLICHE_ABLESUNG", + "PRUEFGEBUEHREN_AUSSERPLANMAESSIG", + "WIRKARBEIT", + "SINGULAER_GENUTZTE_BETRIEBSMITTEL", + "ABGABE_KWKG", + "ABSCHLAG", + "KONZESSIONSABGABE", + "ENTGELT_FERNAUSLESUNG", + "UNTERMESSUNG", + "BLINDMEHRARBEIT", + "ENTGELT_ABRECHNUNG", + "SPERRKOSTEN", + "ENTSPERRKOSTEN", + "MAHNKOSTEN", + "MEHR_MINDERMENGEN", + "INKASSOKOSTEN", + "BLINDMEHRLEISTUNG", + "ENTGELT_MESSUNG_ABLESUNG", + "ENTGELT_EINBAU_BETRIEB_WARTUNG_MESSTECHNIK", + "AUSGLEICHSENERGIE", + "ZAEHLEINRICHTUNG", + "WANDLER_MENGENUMWERTER", + "KOMMUNIKATIONSEINRICHTUNG", + "TECHNISCHE_STEUEREINRICHTUNG", + "PARAGRAF_19_STROM_NEV_UMLAGE", + "BEFESTIGUNGSEINRICHTUNG", + "OFFSHORE_HAFTUNGSUMLAGE", + "FIXE_ARBEITSENTGELTKOMPONENTE", + "FIXE_LEISTUNGSENTGELTKOMPONENTE", + "UMLAGE_ABSCHALTBARE_LASTEN", + "MEHRMENGE", + "MINDERMENGE", + "ENERGIESTEUER", + "SMARTMETER_GATEWAY", + "STEUERBOX", + "MSB_INKL_MESSUNG" + ] + }, + "zonungsgroesse": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "WIRKARBEIT_EL", + "LEISTUNG_EL", + "BLINDARBEIT_KAP", + "BLINDARBEIT_IND", + "BLINDLEISTUNG_KAP", + "BLINDLEISTUNG_IND", + "WIRKARBEIT_TH", + "LEISTUNG_TH", + "VOLUMEN", + "VOLUMENSTROM", + "BENUTZUNGSDAUER", + "ANZAHL" + ] + }, + "zu_abschlaege": { + "$ref": "#/definitions/PositionsAufAbschlag" + }, + "preisstaffeln": { + "type": "array", + "items": { + "$ref": "#/definitions/Preisstaffel" + } + }, + "guid": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "berechnungsmethode", + "leistungstyp", + "leistungsbezeichung", + "preiseinheit", + "bezugsgroesse", + "preisstaffeln" + ] + }, + "Preisstaffel": { + "type": [ + "object", + "null" + ], + "properties": { + "einheitspreis": { + "type": "number" + }, + "staffelgrenzeVon": { + "type": "number" + }, + "staffelgrenzeBis": { + "type": "number" + }, + "sigmoidparameter": { + "$ref": "#/definitions/Sigmoidparameter" + }, + "guid": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "einheitspreis", + "staffelgrenzeVon", + "staffelgrenzeBis" + ] + }, + "Sigmoidparameter": { + "type": [ + "object", + "null" + ], + "properties": { + "A": { + "type": "number" + }, + "B": { + "type": "number" + }, + "C": { + "type": "number" + }, + "D": { + "type": "number" + }, + "guid": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "A", + "B", + "C", + "D" + ] + }, + "Zeitraum": { + "type": "object", + "properties": { + "einheit": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "SEKUNDE", + "MINUTE", + "STUNDE", + "VIERTEL_STUNDE", + "TAG", + "WOCHE", + "MONAT", + "QUARTAL", + "HALBJAHR", + "JAHR" + ] + }, + "dauer": { + "type": [ + "number", + "null" + ] + }, + "startdatum": { + "type": [ + "string", + "null" + ], + "format": "date-time" + }, + "enddatum": { + "type": [ + "string", + "null" + ], + "format": "date-time" + }, + "guid": { + "type": [ + "string", + "null" + ] + } + } + } + }, + "type": "object", + "properties": { + "guid": { + "type": [ + "string", + "null" + ] + }, + "boTyp": { + "type": [ + "string", + "null" + ] + }, + "versionStruktur": { + "type": "integer" + }, + "bezeichnung": { + "type": "string" + }, + "gueltigkeit": { + "$ref": "#/definitions/Zeitraum" + }, + "preispositionen": { + "type": "array", + "items": { + "$ref": "#/definitions/Preisposition" + } + }, + "sparte": { + "type": "string", + "enum": [ + "STROM", + "GAS", + "FERNWAERME", + "NAHWAERME", + "WASSER", + "ABWASSER" + ] + }, + "kundengruppeKA": { + "type": "string", + "enum": [ + "S_TARIF_25000", + "S_TARIF_100000", + "S_TARIF_500000", + "S_TARIF_G_500000", + "S_SONDERKUNDE", + "G_KOWA_25000", + "G_KOWA_100000", + "G_KOWA_500000", + "G_KOWA_G_500000", + "G_TARIF_25000", + "G_TARIF_100000", + "G_TARIF_500000", + "G_TARIF_G_500000", + "G_SONDERKUNDE", + "SONDER_KAS", + "SONDER_SAS", + "SONDER_TAS", + "SONDER_TKS", + "SONDER_TSS" + ] + } + }, + "required": [ + "bezeichnung", + "gueltigkeit", + "preispositionen", + "sparte", + "kundengruppeKA" + ] +} \ No newline at end of file diff --git a/json-schema-files/BO4E.BO.PreisblattMessung.json b/json-schema-files/BO4E.BO.PreisblattMessung.json new file mode 100644 index 00000000..20fdfb70 --- /dev/null +++ b/json-schema-files/BO4E.BO.PreisblattMessung.json @@ -0,0 +1,1579 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "definitions": { + "Adresse": { + "type": [ + "object", + "null" + ], + "properties": { + "postleitzahl": { + "type": "string" + }, + "ort": { + "type": "string" + }, + "strasse": { + "type": [ + "string", + "null" + ] + }, + "hausnummer": { + "type": [ + "string", + "null" + ] + }, + "postfach": { + "type": [ + "string", + "null" + ] + }, + "adresszusatz": { + "type": [ + "string", + "null" + ] + }, + "coErgaenzung": { + "type": [ + "string", + "null" + ] + }, + "landescode": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "AC", + "AD", + "AE", + "AF", + "AG", + "AI", + "AL", + "AM", + "AN", + "AO", + "AQ", + "AR", + "AS", + "AT", + "AU", + "AW", + "AX", + "AZ", + "BA", + "BB", + "BD", + "BE", + "BF", + "BG", + "BH", + "BI", + "BJ", + "BL", + "BM", + "BN", + "BO", + "BQ", + "BR", + "BS", + "BT", + "BU", + "BV", + "BW", + "BY", + "BZ", + "CA", + "CC", + "CD", + "CF", + "CG", + "CH", + "CI", + "CK", + "CL", + "CM", + "CN", + "CO", + "CP", + "CR", + "CS", + "CU", + "CV", + "CW", + "CX", + "CY", + "CZ", + "DE", + "DG", + "DJ", + "DK", + "DM", + "DO", + "DZ", + "EA", + "EC", + "EE", + "EG", + "EH", + "ER", + "ES", + "ET", + "EU", + "FI", + "FJ", + "FK", + "FM", + "FO", + "FR", + "FX", + "GA", + "GB", + "GD", + "GE", + "GF", + "GG", + "GH", + "GI", + "GL", + "GM", + "GN", + "GP", + "GQ", + "GR", + "GS", + "GT", + "GU", + "GW", + "GY", + "HK", + "HM", + "HN", + "HR", + "HT", + "HU", + "IC", + "ID", + "IE", + "IL", + "IM", + "IN", + "IO", + "IQ", + "IR", + "IS", + "IT", + "JE", + "JM", + "JO", + "JP", + "KE", + "KG", + "KH", + "KI", + "KM", + "KN", + "KP", + "KR", + "KW", + "KY", + "KZ", + "LA", + "LB", + "LC", + "LI", + "LK", + "LR", + "LS", + "LT", + "LU", + "LV", + "LY", + "MA", + "MC", + "MD", + "ME", + "MF", + "MG", + "MH", + "MK", + "ML", + "MM", + "MN", + "MO", + "MP", + "MQ", + "MR", + "MS", + "MT", + "MU", + "MV", + "MW", + "MX", + "MY", + "MZ", + "NA", + "NC", + "NE", + "NF", + "NG", + "NI", + "NL", + "NO", + "NP", + "NR", + "NT", + "NU", + "NZ", + "OM", + "PA", + "PE", + "PF", + "PG", + "PH", + "PK", + "PL", + "PM", + "PN", + "PR", + "PS", + "PT", + "PW", + "PY", + "QA", + "RE", + "RO", + "RS", + "RU", + "RW", + "SA", + "SB", + "SC", + "SD", + "SE", + "SF", + "SG", + "SH", + "SI", + "SJ", + "SK", + "SL", + "SM", + "SN", + "SO", + "SR", + "SS", + "ST", + "SU", + "SV", + "SX", + "SY", + "SZ", + "TA", + "TC", + "TD", + "TF", + "TG", + "TJ", + "TK", + "TL", + "TM", + "TN", + "TO", + "TP", + "TR", + "TT", + "TV", + "TW", + "TZ", + "UA", + "UG", + "UK", + "UM", + "US", + "UY", + "UZ", + "VA", + "VC", + "VE", + "VG", + "VI", + "VN", + "VU", + "WF", + "WS", + "XK", + "YE", + "YT", + "YU", + "ZA", + "ZM", + "ZR", + "ZW" + ] + }, + "guid": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "postleitzahl", + "ort" + ] + }, + "Ansprechpartner": { + "type": [ + "object", + "null" + ], + "properties": { + "guid": { + "type": [ + "string", + "null" + ] + }, + "boTyp": { + "type": [ + "string", + "null" + ] + }, + "versionStruktur": { + "type": "integer" + }, + "anrede": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "HERR", + "FRAU", + "EHELEUTE", + "FIRMA", + "INDIVIDUELL", + "DR" + ] + }, + "inviduelleAnrede": { + "type": [ + "string", + "null" + ] + }, + "titel": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "DR", + "PROF", + "PROF_DR" + ] + }, + "vorname": { + "type": [ + "string", + "null" + ] + }, + "nachname": { + "type": "string" + }, + "eMailAdresse": { + "type": [ + "string", + "null" + ] + }, + "kommentar": { + "type": [ + "string", + "null" + ] + }, + "geschaeftspartner": { + "$ref": "#/definitions/Geschaeftspartner" + }, + "adresse": { + "$ref": "#/definitions/Adresse" + }, + "rufnummer": { + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Rufnummer" + } + }, + "zustaendigkeit": { + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Zustaendigkeit" + } + } + }, + "required": [ + "nachname", + "geschaeftspartner" + ] + }, + "Geraeteeigenschaften": { + "type": "object", + "properties": { + "geraetetyp": { + "type": "string", + "enum": [ + "WECHSELSTROMZAEHLER", + "DREHSTROMZAEHLER", + "ZWEIRICHTUNGSZAEHLER", + "RLM_ZAEHLER", + "IMS_ZAEHLER", + "BALGENGASZAEHLER", + "MAXIMUMZAEHLER", + "MULTIPLEXANLAGE", + "PAUSCHALANLAGE", + "VERSTAERKERANLAGE", + "SUMMATIONSGERAET", + "IMPULSGEBER", + "EDL_21_ZAEHLERAUFSATZ", + "VIER_QUADRANTEN_LASTGANGZAEHLER", + "MENGENUMWERTER", + "STROMWANDLER", + "SPANNUNGSWANDLER", + "DATENLOGGER", + "KOMMUNIKATIONSANSCHLUSS", + "MODEM", + "TELEKOMMUNIKATIONSEINRICHTUNG", + "DREHKOLBENGASZAEHLER", + "TURBINENRADGASZAEHLER", + "ULTRASCHALLZAEHLER", + "WIRBELGASZAEHLER", + "MODERNE_MESSEINRICHTUNG", + "ELEKTRONISCHER_HAUSHALTSZAEHLER", + "STEUEREINRICHTUNG", + "TECHNISCHESTEUEREINRICHTUNG", + "TARIFSCHALTGERAET", + "RUNDSTEUEREMPFAENGER", + "OPTIONALE_ZUS_ZAEHLEINRICHTUNG", + "MESSWANDLERSATZ_IMS_MME", + "KOMBIMESSWANDLER_IMS_MME", + "TARIFSCHALTGERAET_IMS_MME", + "RUNDSTEUEREMPFAENGER_IMS_MME", + "TEMPERATUR_KOMPENSATION", + "HOECHSTBELASTUNGS_ANZEIGER", + "SONSTIGES_GERAET", + "SMARTMETERGATEWAY", + "STEUERBOX", + "BLOCKSTROMWANDLER", + "KOMBIMESSWANDLER" + ] + }, + "geraetemerkmal": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "EINTARIF", + "ZWEITARIF", + "MEHRTARIF", + "GAS_G2_5", + "GAS_G4", + "GAS_G6", + "GAS_G10", + "GAS_G16", + "GAS_G25", + "GAS_G40", + "GAS_G65", + "GAS_G100", + "GAS_G160", + "GAS_G250", + "GAS_G400", + "GAS_G650", + "GAS_G1000", + "GAS_G1600", + "GAS_G2500", + "IMPULSGEBER_G4_G100", + "IMPULSGEBER_G100", + "MODEM_GSM", + "MODEM_GPRS", + "MODEM_FUNK", + "MODEM_GSM_O_LG", + "MODEM_GSM_M_LG", + "MODEM_FESTNETZ", + "MODEM_GPRS_M_LG", + "PLC_COM", + "ETHERNET_KOM", + "DSL_KOM", + "LTE_KOM", + "RUNDSTEUEREMPFAENGER", + "TARIFSCHALTGERAET", + "ZUSTANDS_MU", + "TEMPERATUR_MU", + "KOMPAKT_MU", + "SYSTEM_MU" + ] + }, + "Parameter": { + "type": [ + "object", + "null" + ], + "additionalProperties": { + "type": [ + "string", + "null" + ] + } + }, + "guid": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "geraetetyp" + ] + }, + "Geraeteeigenschaften-1": { + "type": [ + "object", + "null" + ], + "properties": { + "geraetetyp": { + "type": "string", + "enum": [ + "WECHSELSTROMZAEHLER", + "DREHSTROMZAEHLER", + "ZWEIRICHTUNGSZAEHLER", + "RLM_ZAEHLER", + "IMS_ZAEHLER", + "BALGENGASZAEHLER", + "MAXIMUMZAEHLER", + "MULTIPLEXANLAGE", + "PAUSCHALANLAGE", + "VERSTAERKERANLAGE", + "SUMMATIONSGERAET", + "IMPULSGEBER", + "EDL_21_ZAEHLERAUFSATZ", + "VIER_QUADRANTEN_LASTGANGZAEHLER", + "MENGENUMWERTER", + "STROMWANDLER", + "SPANNUNGSWANDLER", + "DATENLOGGER", + "KOMMUNIKATIONSANSCHLUSS", + "MODEM", + "TELEKOMMUNIKATIONSEINRICHTUNG", + "DREHKOLBENGASZAEHLER", + "TURBINENRADGASZAEHLER", + "ULTRASCHALLZAEHLER", + "WIRBELGASZAEHLER", + "MODERNE_MESSEINRICHTUNG", + "ELEKTRONISCHER_HAUSHALTSZAEHLER", + "STEUEREINRICHTUNG", + "TECHNISCHESTEUEREINRICHTUNG", + "TARIFSCHALTGERAET", + "RUNDSTEUEREMPFAENGER", + "OPTIONALE_ZUS_ZAEHLEINRICHTUNG", + "MESSWANDLERSATZ_IMS_MME", + "KOMBIMESSWANDLER_IMS_MME", + "TARIFSCHALTGERAET_IMS_MME", + "RUNDSTEUEREMPFAENGER_IMS_MME", + "TEMPERATUR_KOMPENSATION", + "HOECHSTBELASTUNGS_ANZEIGER", + "SONSTIGES_GERAET", + "SMARTMETERGATEWAY", + "STEUERBOX", + "BLOCKSTROMWANDLER", + "KOMBIMESSWANDLER" + ] + }, + "geraetemerkmal": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "EINTARIF", + "ZWEITARIF", + "MEHRTARIF", + "GAS_G2_5", + "GAS_G4", + "GAS_G6", + "GAS_G10", + "GAS_G16", + "GAS_G25", + "GAS_G40", + "GAS_G65", + "GAS_G100", + "GAS_G160", + "GAS_G250", + "GAS_G400", + "GAS_G650", + "GAS_G1000", + "GAS_G1600", + "GAS_G2500", + "IMPULSGEBER_G4_G100", + "IMPULSGEBER_G100", + "MODEM_GSM", + "MODEM_GPRS", + "MODEM_FUNK", + "MODEM_GSM_O_LG", + "MODEM_GSM_M_LG", + "MODEM_FESTNETZ", + "MODEM_GPRS_M_LG", + "PLC_COM", + "ETHERNET_KOM", + "DSL_KOM", + "LTE_KOM", + "RUNDSTEUEREMPFAENGER", + "TARIFSCHALTGERAET", + "ZUSTANDS_MU", + "TEMPERATUR_MU", + "KOMPAKT_MU", + "SYSTEM_MU" + ] + }, + "Parameter": { + "type": [ + "object", + "null" + ], + "additionalProperties": { + "type": [ + "string", + "null" + ] + } + }, + "guid": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "geraetetyp" + ] + }, + "Geschaeftspartner": { + "type": "object", + "properties": { + "guid": { + "type": [ + "string", + "null" + ] + }, + "boTyp": { + "type": [ + "string", + "null" + ] + }, + "versionStruktur": { + "type": "integer" + }, + "anrede": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "HERR", + "FRAU", + "EHELEUTE", + "FIRMA", + "INDIVIDUELL", + "DR" + ] + }, + "title": { + "type": [ + "string", + "null" + ] + }, + "name1": { + "type": [ + "string", + "null" + ] + }, + "name2": { + "type": [ + "string", + "null" + ] + }, + "name3": { + "type": [ + "string", + "null" + ] + }, + "gewerbekennzeichnung": { + "type": "boolean" + }, + "hrnummer": { + "type": [ + "string", + "null" + ] + }, + "amtsgericht": { + "type": [ + "string", + "null" + ] + }, + "kontaktweg": { + "type": [ + "array", + "null" + ], + "items": { + "type": "string", + "enum": [ + "ANSCHREIBEN", + "TELEFONAT", + "FAX", + "E_MAIL", + "SMS" + ] + } + }, + "umsatzsteuerId": { + "type": [ + "string", + "null" + ] + }, + "glaeubigerId": { + "type": [ + "string", + "null" + ] + }, + "eMailAdresse": { + "type": [ + "string", + "null" + ] + }, + "website": { + "type": [ + "string", + "null" + ] + }, + "geschaeftspartnerrolle": { + "type": [ + "array", + "null" + ], + "items": { + "type": "string", + "enum": [ + "LIEFERANT", + "DIENSTLEISTER", + "KUNDE", + "INTERESSENT", + "MARKTPARTNER" + ] + } + }, + "partneradresse": { + "$ref": "#/definitions/Adresse" + } + }, + "required": [ + "gewerbekennzeichnung" + ] + }, + "Marktteilnehmer": { + "type": "object", + "properties": { + "guid": { + "type": [ + "string", + "null" + ] + }, + "boTyp": { + "type": [ + "string", + "null" + ] + }, + "versionStruktur": { + "type": "integer" + }, + "anrede": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "HERR", + "FRAU", + "EHELEUTE", + "FIRMA", + "INDIVIDUELL", + "DR" + ] + }, + "title": { + "type": [ + "string", + "null" + ] + }, + "name1": { + "type": [ + "string", + "null" + ] + }, + "name2": { + "type": [ + "string", + "null" + ] + }, + "name3": { + "type": [ + "string", + "null" + ] + }, + "gewerbekennzeichnung": { + "type": "boolean" + }, + "hrnummer": { + "type": [ + "string", + "null" + ] + }, + "amtsgericht": { + "type": [ + "string", + "null" + ] + }, + "kontaktweg": { + "type": [ + "array", + "null" + ], + "items": { + "type": "string", + "enum": [ + "ANSCHREIBEN", + "TELEFONAT", + "FAX", + "E_MAIL", + "SMS" + ] + } + }, + "umsatzsteuerId": { + "type": [ + "string", + "null" + ] + }, + "glaeubigerId": { + "type": [ + "string", + "null" + ] + }, + "eMailAdresse": { + "type": [ + "string", + "null" + ] + }, + "website": { + "type": [ + "string", + "null" + ] + }, + "geschaeftspartnerrolle": { + "type": [ + "array", + "null" + ], + "items": { + "type": "string", + "enum": [ + "LIEFERANT", + "DIENSTLEISTER", + "KUNDE", + "INTERESSENT", + "MARKTPARTNER" + ] + } + }, + "partneradresse": { + "$ref": "#/definitions/Adresse" + }, + "marktrolle": { + "type": "string", + "enum": [ + "NB", + "LF", + "MSB", + "MDL", + "DL", + "BKV", + "BIKO", + "UENB", + "KUNDE_SELBST_NN", + "MGV", + "EIV", + "RB", + "KUNDE", + "INTERESSENT" + ] + }, + "rollencodenummer": { + "type": "string" + }, + "rollencodetyp": { + "type": "string", + "enum": [ + "BDEW", + "DVGW", + "GLN" + ] + }, + "makoadresse": { + "type": "string" + }, + "ansprechpartner": { + "$ref": "#/definitions/Ansprechpartner" + } + }, + "required": [ + "gewerbekennzeichnung", + "marktrolle", + "rollencodenummer", + "rollencodetyp", + "makoadresse" + ] + }, + "PositionsAufAbschlag": { + "type": [ + "object", + "null" + ], + "properties": { + "bezeichnung": { + "type": "string" + }, + "beschreibung": { + "type": "string" + }, + "aufAbschlagstyp": { + "type": "string", + "enum": [ + "RELATIV", + "ABSOLUT" + ] + }, + "aufAbschlagswert": { + "type": "number" + }, + "aufAbschlagswaehrung": { + "type": "string", + "enum": [ + "EUR", + "CT" + ] + }, + "guid": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "bezeichnung", + "beschreibung", + "aufAbschlagstyp", + "aufAbschlagswert", + "aufAbschlagswaehrung" + ] + }, + "Preisposition": { + "type": [ + "object", + "null" + ], + "properties": { + "berechnungsmethode": { + "type": "string", + "enum": [ + "KEINE", + "STAFFELN", + "ZONEN", + "VORZONEN_GP", + "SIGMOID", + "BLINDARBEIT_GT_50_PROZENT", + "BLINDARBEIT_GT_40_PROZENT", + "AP_GP_ZONEN", + "LP_INSTALL_LEISTUNG", + "AP_TRANSPORT_ODER_VERTEILNETZ", + "AP_TRANSPORT_ODER_VERTEILNETZ_ORTSVERTEILNETZ_SIGMOID", + "LP_JAHRESVERBRAUCH", + "LP_TRANSPORT_ODER_VERTEILNETZ", + "LP_TRANSPORT_ODER_VERTEILNETZ_ORTSVERTEILNETZ_SIGMOID", + "FUNKTIONEN", + "VERBRAUCH_UEBER_SLP_GRENZE_FUNKTIONSBEZOGEN_WEITERE_BERECHNUNG_ALS_LGK" + ] + }, + "leistungstyp": { + "type": "string", + "enum": [ + "ARBEITSPREIS_WIRKARBEIT", + "LEISTUNGSPREIS_WIRKLEISTUNG", + "ARBEITSPREIS_BLINDARBEIT_IND", + "ARBEITSPREIS_BLINDARBEIT_KAP", + "GRUNDPREIS", + "MEHRMINDERMENGE", + "MESSSTELLENBETRIEB", + "MESSDIENSTLEISTUNG", + "MESSDIENSTLEISTUNG_INKL_MESSUNG", + "ABRECHNUNG", + "KONZESSIONS_ABGABE", + "KWK_UMLAGE", + "OFFSHORE_UMLAGE", + "ABLAV_UMLAGE", + "REGELENERGIE_UMLAGE", + "BILANZIERUNG_UMLAGE", + "AUSLESUNG_ZUSAETZLICH", + "ABLESUNG_ZUSAETZLICH", + "ABRECHNUNG_ZUSAETZLICH", + "SPERRUNG", + "ENTSPERRUNG", + "MAHNKOSTEN", + "INKASSOKOSTEN" + ] + }, + "leistungsbezeichung": { + "type": "string" + }, + "preiseinheit": { + "type": "string", + "enum": [ + "EUR", + "CT" + ] + }, + "bezugsgroesse": { + "type": "string", + "enum": [ + "WH", + "KW", + "ANZAHL", + "KUBIKMETER", + "STUNDE", + "TAG", + "MONAT", + "VAR", + "VARH", + "JAHR", + "KWH", + "MW", + "KVAR", + "KVARH", + "MWH" + ] + }, + "zeitbasis": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "SEKUNDE", + "MINUTE", + "STUNDE", + "VIERTEL_STUNDE", + "TAG", + "WOCHE", + "MONAT", + "QUARTAL", + "HALBJAHR", + "JAHR" + ] + }, + "tarifzeit": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "TZ_STANDARD", + "TZ_HT", + "TZ_NT" + ] + }, + "bdewArtikelnummer": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "LEISTUNG", + "LEISTUNG_PAUSCHAL", + "GRUNDPREIS", + "REGELENERGIE_ARBEIT", + "REGELENERGIE_LEISTUNG", + "NOTSTROMLIEFERUNG_ARBEIT", + "NOTSTROMLIEFERUNG_LEISTUNG", + "RESERVENETZKAPAZITAET", + "RESERVELEISTUNG", + "ZUSAETZLICHE_ABLESUNG", + "PRUEFGEBUEHREN_AUSSERPLANMAESSIG", + "WIRKARBEIT", + "SINGULAER_GENUTZTE_BETRIEBSMITTEL", + "ABGABE_KWKG", + "ABSCHLAG", + "KONZESSIONSABGABE", + "ENTGELT_FERNAUSLESUNG", + "UNTERMESSUNG", + "BLINDMEHRARBEIT", + "ENTGELT_ABRECHNUNG", + "SPERRKOSTEN", + "ENTSPERRKOSTEN", + "MAHNKOSTEN", + "MEHR_MINDERMENGEN", + "INKASSOKOSTEN", + "BLINDMEHRLEISTUNG", + "ENTGELT_MESSUNG_ABLESUNG", + "ENTGELT_EINBAU_BETRIEB_WARTUNG_MESSTECHNIK", + "AUSGLEICHSENERGIE", + "ZAEHLEINRICHTUNG", + "WANDLER_MENGENUMWERTER", + "KOMMUNIKATIONSEINRICHTUNG", + "TECHNISCHE_STEUEREINRICHTUNG", + "PARAGRAF_19_STROM_NEV_UMLAGE", + "BEFESTIGUNGSEINRICHTUNG", + "OFFSHORE_HAFTUNGSUMLAGE", + "FIXE_ARBEITSENTGELTKOMPONENTE", + "FIXE_LEISTUNGSENTGELTKOMPONENTE", + "UMLAGE_ABSCHALTBARE_LASTEN", + "MEHRMENGE", + "MINDERMENGE", + "ENERGIESTEUER", + "SMARTMETER_GATEWAY", + "STEUERBOX", + "MSB_INKL_MESSUNG" + ] + }, + "zonungsgroesse": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "WIRKARBEIT_EL", + "LEISTUNG_EL", + "BLINDARBEIT_KAP", + "BLINDARBEIT_IND", + "BLINDLEISTUNG_KAP", + "BLINDLEISTUNG_IND", + "WIRKARBEIT_TH", + "LEISTUNG_TH", + "VOLUMEN", + "VOLUMENSTROM", + "BENUTZUNGSDAUER", + "ANZAHL" + ] + }, + "zu_abschlaege": { + "$ref": "#/definitions/PositionsAufAbschlag" + }, + "preisstaffeln": { + "type": "array", + "items": { + "$ref": "#/definitions/Preisstaffel" + } + }, + "guid": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "berechnungsmethode", + "leistungstyp", + "leistungsbezeichung", + "preiseinheit", + "bezugsgroesse", + "preisstaffeln" + ] + }, + "Preisstaffel": { + "type": [ + "object", + "null" + ], + "properties": { + "einheitspreis": { + "type": "number" + }, + "staffelgrenzeVon": { + "type": "number" + }, + "staffelgrenzeBis": { + "type": "number" + }, + "sigmoidparameter": { + "$ref": "#/definitions/Sigmoidparameter" + }, + "guid": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "einheitspreis", + "staffelgrenzeVon", + "staffelgrenzeBis" + ] + }, + "Rufnummer": { + "type": [ + "object", + "null" + ], + "properties": { + "nummerntyp": { + "type": "string", + "enum": [ + "RUF_ZENTRALE", + "FAX_ZENTRALE", + "SAMMELRUF", + "SAMMELFAX", + "ABTEILUNGRUF", + "ABTEILUNGFAX", + "RUF_DURCHWAHL", + "FAX_DURCHWAHL", + "MOBIL_NUMMER" + ] + }, + "rufnummer": { + "type": "string" + }, + "guid": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "nummerntyp", + "rufnummer" + ] + }, + "Sigmoidparameter": { + "type": [ + "object", + "null" + ], + "properties": { + "A": { + "type": "number" + }, + "B": { + "type": "number" + }, + "C": { + "type": "number" + }, + "D": { + "type": "number" + }, + "guid": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "A", + "B", + "C", + "D" + ] + }, + "Zeitraum": { + "type": "object", + "properties": { + "einheit": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "SEKUNDE", + "MINUTE", + "STUNDE", + "VIERTEL_STUNDE", + "TAG", + "WOCHE", + "MONAT", + "QUARTAL", + "HALBJAHR", + "JAHR" + ] + }, + "dauer": { + "type": [ + "number", + "null" + ] + }, + "startdatum": { + "type": [ + "string", + "null" + ], + "format": "date-time" + }, + "enddatum": { + "type": [ + "string", + "null" + ], + "format": "date-time" + }, + "guid": { + "type": [ + "string", + "null" + ] + } + } + }, + "Zustaendigkeit": { + "type": [ + "object", + "null" + ], + "properties": { + "jobtitel": { + "type": [ + "string", + "null" + ] + }, + "abteilung": { + "type": [ + "string", + "null" + ] + }, + "themengebiet": { + "type": [ + "string", + "null" + ] + }, + "guid": { + "type": [ + "string", + "null" + ] + } + } + } + }, + "type": "object", + "properties": { + "guid": { + "type": [ + "string", + "null" + ] + }, + "boTyp": { + "type": [ + "string", + "null" + ] + }, + "versionStruktur": { + "type": "integer" + }, + "bezeichnung": { + "type": "string" + }, + "gueltigkeit": { + "$ref": "#/definitions/Zeitraum" + }, + "preispositionen": { + "type": "array", + "items": { + "$ref": "#/definitions/Preisposition" + } + }, + "sparte": { + "type": "string", + "enum": [ + "STROM", + "GAS", + "FERNWAERME", + "NAHWAERME", + "WASSER", + "ABWASSER" + ] + }, + "bilanzierungsmethode": { + "type": "string", + "enum": [ + "RLM", + "SLP", + "TLP_GEMEINSAM", + "TLP_GETRENNT", + "PAUSCHAL", + "IMS" + ] + }, + "messebene": { + "type": "string", + "enum": [ + "NSP", + "MSP", + "HSP", + "HSS", + "MSP_NSP_UMSP", + "HSP_MSP_UMSP", + "HSS_HSP_UMSP", + "HD", + "MD", + "ND" + ] + }, + "inklusiveDienstleistung": { + "type": [ + "array", + "null" + ], + "items": { + "type": "string", + "enum": [ + "DATENBEREITSTELLUNG_TAEGLICH", + "DATENBEREITSTELLUNG_WOECHENTLICH", + "DATENBEREITSTELLUNG_MONATLICH", + "DATENBEREITSTELLUNG_JAEHRLICH", + "DATENBEREITSTELLUNG_HISTORISCHE_LG", + "DATENBEREITSTELLUNG_STUENDLICH", + "DATENBEREITSTELLUNG_VIERTELJAEHRLICH", + "DATENBEREITSTELLUNG_HALBJAEHRLICH", + "DATENBEREITSTELLUNG_MONATLICH_ZUSAETZLICH", + "DATENBEREITSTELLUNG_EINMALIG", + "AUSLESUNG_2X_TAEGLICH_FERNAUSLESUNG", + "AUSLESUNG_TAEGLICH_FERNAUSLESUNG", + "AUSLESUNG_LGK_MANUELL_MSB", + "AUSLESUNG_MONATLICH_SLP_FERNAUSLESUNG", + "AUSLESUNG_JAEHRLICH_SLP_FERNAUSLESUNG", + "AUSLESUNG_MDE_SLP", + "ABLESUNG_MONATLICH_SLP", + "ABLESUNG_VIERTELJAEHRLICH_SLP", + "ABLESUNG_HALBJAEHRLICH_SLP", + "ABLESUNG_JAEHRLICH_SLP", + "AUSLESUNG_SLP_FERNAUSLESUNG", + "ABLESUNG_SLP_ZUSAETZLICH_MSB", + "ABLESUNG_SLP_ZUSAETZLICH_KUNDE", + "AUSLESUNG_LGK_FERNAUSLESUNG_ZUSAETZLICH_MSB", + "AUSLESUNG_MOATLICH_FERNAUSLESUNG", + "AUSLESUNG_STUENDLICH_FERNAUSLESUNG", + "ABLESUNG_MONATLICH_LGK", + "AUSLESUNG_TEMERATURMENGENUMWERTER", + "AUSLESUNG_ZUSTANDSMENGENUMWERTER", + "AUSLESUNG_SYSTEMMENGENUMWERTER", + "AUSLESUNG_VORGANG_SLP", + "AUSLESUUNG_KOMPAKTMENGENUMWERTER", + "AUSLESUNG_MDE_LGK", + "SPERRUNG_SLP", + "ENTSPERRUNG_SLP", + "SPERRUNG_RLM", + "ENTSPERRUNG_RLM", + "MAHNKOSTEN", + "INKASSOKOSTEN" + ] + } + }, + "basisgeraet": { + "$ref": "#/definitions/Geraeteeigenschaften" + }, + "inklusiveGeraete": { + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Geraeteeigenschaften-1" + } + }, + "herausgeber": { + "$ref": "#/definitions/Marktteilnehmer" + } + }, + "required": [ + "bezeichnung", + "gueltigkeit", + "preispositionen", + "sparte", + "bilanzierungsmethode", + "messebene", + "basisgeraet", + "herausgeber" + ] +} \ No newline at end of file diff --git a/json-schema-files/BO4E.BO.PreisblattNetznutzung.json b/json-schema-files/BO4E.BO.PreisblattNetznutzung.json new file mode 100644 index 00000000..debd5a4a --- /dev/null +++ b/json-schema-files/BO4E.BO.PreisblattNetznutzung.json @@ -0,0 +1,1307 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "definitions": { + "Adresse": { + "type": [ + "object", + "null" + ], + "properties": { + "postleitzahl": { + "type": "string" + }, + "ort": { + "type": "string" + }, + "strasse": { + "type": [ + "string", + "null" + ] + }, + "hausnummer": { + "type": [ + "string", + "null" + ] + }, + "postfach": { + "type": [ + "string", + "null" + ] + }, + "adresszusatz": { + "type": [ + "string", + "null" + ] + }, + "coErgaenzung": { + "type": [ + "string", + "null" + ] + }, + "landescode": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "AC", + "AD", + "AE", + "AF", + "AG", + "AI", + "AL", + "AM", + "AN", + "AO", + "AQ", + "AR", + "AS", + "AT", + "AU", + "AW", + "AX", + "AZ", + "BA", + "BB", + "BD", + "BE", + "BF", + "BG", + "BH", + "BI", + "BJ", + "BL", + "BM", + "BN", + "BO", + "BQ", + "BR", + "BS", + "BT", + "BU", + "BV", + "BW", + "BY", + "BZ", + "CA", + "CC", + "CD", + "CF", + "CG", + "CH", + "CI", + "CK", + "CL", + "CM", + "CN", + "CO", + "CP", + "CR", + "CS", + "CU", + "CV", + "CW", + "CX", + "CY", + "CZ", + "DE", + "DG", + "DJ", + "DK", + "DM", + "DO", + "DZ", + "EA", + "EC", + "EE", + "EG", + "EH", + "ER", + "ES", + "ET", + "EU", + "FI", + "FJ", + "FK", + "FM", + "FO", + "FR", + "FX", + "GA", + "GB", + "GD", + "GE", + "GF", + "GG", + "GH", + "GI", + "GL", + "GM", + "GN", + "GP", + "GQ", + "GR", + "GS", + "GT", + "GU", + "GW", + "GY", + "HK", + "HM", + "HN", + "HR", + "HT", + "HU", + "IC", + "ID", + "IE", + "IL", + "IM", + "IN", + "IO", + "IQ", + "IR", + "IS", + "IT", + "JE", + "JM", + "JO", + "JP", + "KE", + "KG", + "KH", + "KI", + "KM", + "KN", + "KP", + "KR", + "KW", + "KY", + "KZ", + "LA", + "LB", + "LC", + "LI", + "LK", + "LR", + "LS", + "LT", + "LU", + "LV", + "LY", + "MA", + "MC", + "MD", + "ME", + "MF", + "MG", + "MH", + "MK", + "ML", + "MM", + "MN", + "MO", + "MP", + "MQ", + "MR", + "MS", + "MT", + "MU", + "MV", + "MW", + "MX", + "MY", + "MZ", + "NA", + "NC", + "NE", + "NF", + "NG", + "NI", + "NL", + "NO", + "NP", + "NR", + "NT", + "NU", + "NZ", + "OM", + "PA", + "PE", + "PF", + "PG", + "PH", + "PK", + "PL", + "PM", + "PN", + "PR", + "PS", + "PT", + "PW", + "PY", + "QA", + "RE", + "RO", + "RS", + "RU", + "RW", + "SA", + "SB", + "SC", + "SD", + "SE", + "SF", + "SG", + "SH", + "SI", + "SJ", + "SK", + "SL", + "SM", + "SN", + "SO", + "SR", + "SS", + "ST", + "SU", + "SV", + "SX", + "SY", + "SZ", + "TA", + "TC", + "TD", + "TF", + "TG", + "TJ", + "TK", + "TL", + "TM", + "TN", + "TO", + "TP", + "TR", + "TT", + "TV", + "TW", + "TZ", + "UA", + "UG", + "UK", + "UM", + "US", + "UY", + "UZ", + "VA", + "VC", + "VE", + "VG", + "VI", + "VN", + "VU", + "WF", + "WS", + "XK", + "YE", + "YT", + "YU", + "ZA", + "ZM", + "ZR", + "ZW" + ] + }, + "guid": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "postleitzahl", + "ort" + ] + }, + "Ansprechpartner": { + "type": [ + "object", + "null" + ], + "properties": { + "guid": { + "type": [ + "string", + "null" + ] + }, + "boTyp": { + "type": [ + "string", + "null" + ] + }, + "versionStruktur": { + "type": "integer" + }, + "anrede": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "HERR", + "FRAU", + "EHELEUTE", + "FIRMA", + "INDIVIDUELL", + "DR" + ] + }, + "inviduelleAnrede": { + "type": [ + "string", + "null" + ] + }, + "titel": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "DR", + "PROF", + "PROF_DR" + ] + }, + "vorname": { + "type": [ + "string", + "null" + ] + }, + "nachname": { + "type": "string" + }, + "eMailAdresse": { + "type": [ + "string", + "null" + ] + }, + "kommentar": { + "type": [ + "string", + "null" + ] + }, + "geschaeftspartner": { + "$ref": "#/definitions/Geschaeftspartner" + }, + "adresse": { + "$ref": "#/definitions/Adresse" + }, + "rufnummer": { + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Rufnummer" + } + }, + "zustaendigkeit": { + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Zustaendigkeit" + } + } + }, + "required": [ + "nachname", + "geschaeftspartner" + ] + }, + "Geschaeftspartner": { + "type": "object", + "properties": { + "guid": { + "type": [ + "string", + "null" + ] + }, + "boTyp": { + "type": [ + "string", + "null" + ] + }, + "versionStruktur": { + "type": "integer" + }, + "anrede": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "HERR", + "FRAU", + "EHELEUTE", + "FIRMA", + "INDIVIDUELL", + "DR" + ] + }, + "title": { + "type": [ + "string", + "null" + ] + }, + "name1": { + "type": [ + "string", + "null" + ] + }, + "name2": { + "type": [ + "string", + "null" + ] + }, + "name3": { + "type": [ + "string", + "null" + ] + }, + "gewerbekennzeichnung": { + "type": "boolean" + }, + "hrnummer": { + "type": [ + "string", + "null" + ] + }, + "amtsgericht": { + "type": [ + "string", + "null" + ] + }, + "kontaktweg": { + "type": [ + "array", + "null" + ], + "items": { + "type": "string", + "enum": [ + "ANSCHREIBEN", + "TELEFONAT", + "FAX", + "E_MAIL", + "SMS" + ] + } + }, + "umsatzsteuerId": { + "type": [ + "string", + "null" + ] + }, + "glaeubigerId": { + "type": [ + "string", + "null" + ] + }, + "eMailAdresse": { + "type": [ + "string", + "null" + ] + }, + "website": { + "type": [ + "string", + "null" + ] + }, + "geschaeftspartnerrolle": { + "type": [ + "array", + "null" + ], + "items": { + "type": "string", + "enum": [ + "LIEFERANT", + "DIENSTLEISTER", + "KUNDE", + "INTERESSENT", + "MARKTPARTNER" + ] + } + }, + "partneradresse": { + "$ref": "#/definitions/Adresse" + } + }, + "required": [ + "gewerbekennzeichnung" + ] + }, + "Marktteilnehmer": { + "type": "object", + "properties": { + "guid": { + "type": [ + "string", + "null" + ] + }, + "boTyp": { + "type": [ + "string", + "null" + ] + }, + "versionStruktur": { + "type": "integer" + }, + "anrede": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "HERR", + "FRAU", + "EHELEUTE", + "FIRMA", + "INDIVIDUELL", + "DR" + ] + }, + "title": { + "type": [ + "string", + "null" + ] + }, + "name1": { + "type": [ + "string", + "null" + ] + }, + "name2": { + "type": [ + "string", + "null" + ] + }, + "name3": { + "type": [ + "string", + "null" + ] + }, + "gewerbekennzeichnung": { + "type": "boolean" + }, + "hrnummer": { + "type": [ + "string", + "null" + ] + }, + "amtsgericht": { + "type": [ + "string", + "null" + ] + }, + "kontaktweg": { + "type": [ + "array", + "null" + ], + "items": { + "type": "string", + "enum": [ + "ANSCHREIBEN", + "TELEFONAT", + "FAX", + "E_MAIL", + "SMS" + ] + } + }, + "umsatzsteuerId": { + "type": [ + "string", + "null" + ] + }, + "glaeubigerId": { + "type": [ + "string", + "null" + ] + }, + "eMailAdresse": { + "type": [ + "string", + "null" + ] + }, + "website": { + "type": [ + "string", + "null" + ] + }, + "geschaeftspartnerrolle": { + "type": [ + "array", + "null" + ], + "items": { + "type": "string", + "enum": [ + "LIEFERANT", + "DIENSTLEISTER", + "KUNDE", + "INTERESSENT", + "MARKTPARTNER" + ] + } + }, + "partneradresse": { + "$ref": "#/definitions/Adresse" + }, + "marktrolle": { + "type": "string", + "enum": [ + "NB", + "LF", + "MSB", + "MDL", + "DL", + "BKV", + "BIKO", + "UENB", + "KUNDE_SELBST_NN", + "MGV", + "EIV", + "RB", + "KUNDE", + "INTERESSENT" + ] + }, + "rollencodenummer": { + "type": "string" + }, + "rollencodetyp": { + "type": "string", + "enum": [ + "BDEW", + "DVGW", + "GLN" + ] + }, + "makoadresse": { + "type": "string" + }, + "ansprechpartner": { + "$ref": "#/definitions/Ansprechpartner" + } + }, + "required": [ + "gewerbekennzeichnung", + "marktrolle", + "rollencodenummer", + "rollencodetyp", + "makoadresse" + ] + }, + "PositionsAufAbschlag": { + "type": [ + "object", + "null" + ], + "properties": { + "bezeichnung": { + "type": "string" + }, + "beschreibung": { + "type": "string" + }, + "aufAbschlagstyp": { + "type": "string", + "enum": [ + "RELATIV", + "ABSOLUT" + ] + }, + "aufAbschlagswert": { + "type": "number" + }, + "aufAbschlagswaehrung": { + "type": "string", + "enum": [ + "EUR", + "CT" + ] + }, + "guid": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "bezeichnung", + "beschreibung", + "aufAbschlagstyp", + "aufAbschlagswert", + "aufAbschlagswaehrung" + ] + }, + "Preisposition": { + "type": [ + "object", + "null" + ], + "properties": { + "berechnungsmethode": { + "type": "string", + "enum": [ + "KEINE", + "STAFFELN", + "ZONEN", + "VORZONEN_GP", + "SIGMOID", + "BLINDARBEIT_GT_50_PROZENT", + "BLINDARBEIT_GT_40_PROZENT", + "AP_GP_ZONEN", + "LP_INSTALL_LEISTUNG", + "AP_TRANSPORT_ODER_VERTEILNETZ", + "AP_TRANSPORT_ODER_VERTEILNETZ_ORTSVERTEILNETZ_SIGMOID", + "LP_JAHRESVERBRAUCH", + "LP_TRANSPORT_ODER_VERTEILNETZ", + "LP_TRANSPORT_ODER_VERTEILNETZ_ORTSVERTEILNETZ_SIGMOID", + "FUNKTIONEN", + "VERBRAUCH_UEBER_SLP_GRENZE_FUNKTIONSBEZOGEN_WEITERE_BERECHNUNG_ALS_LGK" + ] + }, + "leistungstyp": { + "type": "string", + "enum": [ + "ARBEITSPREIS_WIRKARBEIT", + "LEISTUNGSPREIS_WIRKLEISTUNG", + "ARBEITSPREIS_BLINDARBEIT_IND", + "ARBEITSPREIS_BLINDARBEIT_KAP", + "GRUNDPREIS", + "MEHRMINDERMENGE", + "MESSSTELLENBETRIEB", + "MESSDIENSTLEISTUNG", + "MESSDIENSTLEISTUNG_INKL_MESSUNG", + "ABRECHNUNG", + "KONZESSIONS_ABGABE", + "KWK_UMLAGE", + "OFFSHORE_UMLAGE", + "ABLAV_UMLAGE", + "REGELENERGIE_UMLAGE", + "BILANZIERUNG_UMLAGE", + "AUSLESUNG_ZUSAETZLICH", + "ABLESUNG_ZUSAETZLICH", + "ABRECHNUNG_ZUSAETZLICH", + "SPERRUNG", + "ENTSPERRUNG", + "MAHNKOSTEN", + "INKASSOKOSTEN" + ] + }, + "leistungsbezeichung": { + "type": "string" + }, + "preiseinheit": { + "type": "string", + "enum": [ + "EUR", + "CT" + ] + }, + "bezugsgroesse": { + "type": "string", + "enum": [ + "WH", + "KW", + "ANZAHL", + "KUBIKMETER", + "STUNDE", + "TAG", + "MONAT", + "VAR", + "VARH", + "JAHR", + "KWH", + "MW", + "KVAR", + "KVARH", + "MWH" + ] + }, + "zeitbasis": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "SEKUNDE", + "MINUTE", + "STUNDE", + "VIERTEL_STUNDE", + "TAG", + "WOCHE", + "MONAT", + "QUARTAL", + "HALBJAHR", + "JAHR" + ] + }, + "tarifzeit": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "TZ_STANDARD", + "TZ_HT", + "TZ_NT" + ] + }, + "bdewArtikelnummer": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "LEISTUNG", + "LEISTUNG_PAUSCHAL", + "GRUNDPREIS", + "REGELENERGIE_ARBEIT", + "REGELENERGIE_LEISTUNG", + "NOTSTROMLIEFERUNG_ARBEIT", + "NOTSTROMLIEFERUNG_LEISTUNG", + "RESERVENETZKAPAZITAET", + "RESERVELEISTUNG", + "ZUSAETZLICHE_ABLESUNG", + "PRUEFGEBUEHREN_AUSSERPLANMAESSIG", + "WIRKARBEIT", + "SINGULAER_GENUTZTE_BETRIEBSMITTEL", + "ABGABE_KWKG", + "ABSCHLAG", + "KONZESSIONSABGABE", + "ENTGELT_FERNAUSLESUNG", + "UNTERMESSUNG", + "BLINDMEHRARBEIT", + "ENTGELT_ABRECHNUNG", + "SPERRKOSTEN", + "ENTSPERRKOSTEN", + "MAHNKOSTEN", + "MEHR_MINDERMENGEN", + "INKASSOKOSTEN", + "BLINDMEHRLEISTUNG", + "ENTGELT_MESSUNG_ABLESUNG", + "ENTGELT_EINBAU_BETRIEB_WARTUNG_MESSTECHNIK", + "AUSGLEICHSENERGIE", + "ZAEHLEINRICHTUNG", + "WANDLER_MENGENUMWERTER", + "KOMMUNIKATIONSEINRICHTUNG", + "TECHNISCHE_STEUEREINRICHTUNG", + "PARAGRAF_19_STROM_NEV_UMLAGE", + "BEFESTIGUNGSEINRICHTUNG", + "OFFSHORE_HAFTUNGSUMLAGE", + "FIXE_ARBEITSENTGELTKOMPONENTE", + "FIXE_LEISTUNGSENTGELTKOMPONENTE", + "UMLAGE_ABSCHALTBARE_LASTEN", + "MEHRMENGE", + "MINDERMENGE", + "ENERGIESTEUER", + "SMARTMETER_GATEWAY", + "STEUERBOX", + "MSB_INKL_MESSUNG" + ] + }, + "zonungsgroesse": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "WIRKARBEIT_EL", + "LEISTUNG_EL", + "BLINDARBEIT_KAP", + "BLINDARBEIT_IND", + "BLINDLEISTUNG_KAP", + "BLINDLEISTUNG_IND", + "WIRKARBEIT_TH", + "LEISTUNG_TH", + "VOLUMEN", + "VOLUMENSTROM", + "BENUTZUNGSDAUER", + "ANZAHL" + ] + }, + "zu_abschlaege": { + "$ref": "#/definitions/PositionsAufAbschlag" + }, + "preisstaffeln": { + "type": "array", + "items": { + "$ref": "#/definitions/Preisstaffel" + } + }, + "guid": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "berechnungsmethode", + "leistungstyp", + "leistungsbezeichung", + "preiseinheit", + "bezugsgroesse", + "preisstaffeln" + ] + }, + "Preisstaffel": { + "type": [ + "object", + "null" + ], + "properties": { + "einheitspreis": { + "type": "number" + }, + "staffelgrenzeVon": { + "type": "number" + }, + "staffelgrenzeBis": { + "type": "number" + }, + "sigmoidparameter": { + "$ref": "#/definitions/Sigmoidparameter" + }, + "guid": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "einheitspreis", + "staffelgrenzeVon", + "staffelgrenzeBis" + ] + }, + "Rufnummer": { + "type": [ + "object", + "null" + ], + "properties": { + "nummerntyp": { + "type": "string", + "enum": [ + "RUF_ZENTRALE", + "FAX_ZENTRALE", + "SAMMELRUF", + "SAMMELFAX", + "ABTEILUNGRUF", + "ABTEILUNGFAX", + "RUF_DURCHWAHL", + "FAX_DURCHWAHL", + "MOBIL_NUMMER" + ] + }, + "rufnummer": { + "type": "string" + }, + "guid": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "nummerntyp", + "rufnummer" + ] + }, + "Sigmoidparameter": { + "type": [ + "object", + "null" + ], + "properties": { + "A": { + "type": "number" + }, + "B": { + "type": "number" + }, + "C": { + "type": "number" + }, + "D": { + "type": "number" + }, + "guid": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "A", + "B", + "C", + "D" + ] + }, + "Zeitraum": { + "type": "object", + "properties": { + "einheit": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "SEKUNDE", + "MINUTE", + "STUNDE", + "VIERTEL_STUNDE", + "TAG", + "WOCHE", + "MONAT", + "QUARTAL", + "HALBJAHR", + "JAHR" + ] + }, + "dauer": { + "type": [ + "number", + "null" + ] + }, + "startdatum": { + "type": [ + "string", + "null" + ], + "format": "date-time" + }, + "enddatum": { + "type": [ + "string", + "null" + ], + "format": "date-time" + }, + "guid": { + "type": [ + "string", + "null" + ] + } + } + }, + "Zustaendigkeit": { + "type": [ + "object", + "null" + ], + "properties": { + "jobtitel": { + "type": [ + "string", + "null" + ] + }, + "abteilung": { + "type": [ + "string", + "null" + ] + }, + "themengebiet": { + "type": [ + "string", + "null" + ] + }, + "guid": { + "type": [ + "string", + "null" + ] + } + } + } + }, + "type": "object", + "properties": { + "guid": { + "type": [ + "string", + "null" + ] + }, + "boTyp": { + "type": [ + "string", + "null" + ] + }, + "versionStruktur": { + "type": "integer" + }, + "bezeichnung": { + "type": "string" + }, + "gueltigkeit": { + "$ref": "#/definitions/Zeitraum" + }, + "preispositionen": { + "type": "array", + "items": { + "$ref": "#/definitions/Preisposition" + } + }, + "sparte": { + "type": "string", + "enum": [ + "STROM", + "GAS", + "FERNWAERME", + "NAHWAERME", + "WASSER", + "ABWASSER" + ] + }, + "bilanzierungsmethode": { + "type": "string", + "enum": [ + "RLM", + "SLP", + "TLP_GEMEINSAM", + "TLP_GETRENNT", + "PAUSCHAL", + "IMS" + ] + }, + "netzebene": { + "type": "string", + "enum": [ + "NSP", + "MSP", + "HSP", + "HSS", + "MSP_NSP_UMSP", + "HSP_MSP_UMSP", + "HSS_HSP_UMSP", + "HD", + "MD", + "ND" + ] + }, + "kundengruppe": { + "type": "string", + "enum": [ + "RLM", + "SLP_S_G0", + "SLP_S_G1", + "SLP_S_G2", + "SLP_S_G3", + "SLP_S_G4", + "SLP_S_G5", + "SLP_S_G6", + "SLP_S_G7", + "SLP_S_L0", + "SLP_S_L1", + "SLP_S_L2", + "SLP_S_H0", + "SLP_S_SB", + "SLP_S_HZ", + "SLP_S_WP", + "SLP_G_GKO", + "SLP_G_GHA", + "SLP_G_GMK", + "SLP_G_GBD", + "SLP_G_GGA", + "SLP_G_GBH", + "SLP_G_GBA", + "SLP_G_GWA", + "SLP_G_GGB", + "SLP_G_GPD", + "SLP_G_GMF", + "SLP_G_HEF", + "SLP_G_HMF", + "SLP_G_HKO" + ] + }, + "herausgeber": { + "$ref": "#/definitions/Marktteilnehmer" + } + }, + "required": [ + "bezeichnung", + "gueltigkeit", + "preispositionen", + "sparte", + "bilanzierungsmethode", + "netzebene", + "kundengruppe", + "herausgeber" + ] +} \ No newline at end of file diff --git a/json-schema-files/BO4E.BO.PreisblattUmlagen.json b/json-schema-files/BO4E.BO.PreisblattUmlagen.json new file mode 100644 index 00000000..ccc87d11 --- /dev/null +++ b/json-schema-files/BO4E.BO.PreisblattUmlagen.json @@ -0,0 +1,425 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "definitions": { + "PositionsAufAbschlag": { + "type": [ + "object", + "null" + ], + "properties": { + "bezeichnung": { + "type": "string" + }, + "beschreibung": { + "type": "string" + }, + "aufAbschlagstyp": { + "type": "string", + "enum": [ + "RELATIV", + "ABSOLUT" + ] + }, + "aufAbschlagswert": { + "type": "number" + }, + "aufAbschlagswaehrung": { + "type": "string", + "enum": [ + "EUR", + "CT" + ] + }, + "guid": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "bezeichnung", + "beschreibung", + "aufAbschlagstyp", + "aufAbschlagswert", + "aufAbschlagswaehrung" + ] + }, + "Preisposition": { + "type": [ + "object", + "null" + ], + "properties": { + "berechnungsmethode": { + "type": "string", + "enum": [ + "KEINE", + "STAFFELN", + "ZONEN", + "VORZONEN_GP", + "SIGMOID", + "BLINDARBEIT_GT_50_PROZENT", + "BLINDARBEIT_GT_40_PROZENT", + "AP_GP_ZONEN", + "LP_INSTALL_LEISTUNG", + "AP_TRANSPORT_ODER_VERTEILNETZ", + "AP_TRANSPORT_ODER_VERTEILNETZ_ORTSVERTEILNETZ_SIGMOID", + "LP_JAHRESVERBRAUCH", + "LP_TRANSPORT_ODER_VERTEILNETZ", + "LP_TRANSPORT_ODER_VERTEILNETZ_ORTSVERTEILNETZ_SIGMOID", + "FUNKTIONEN", + "VERBRAUCH_UEBER_SLP_GRENZE_FUNKTIONSBEZOGEN_WEITERE_BERECHNUNG_ALS_LGK" + ] + }, + "leistungstyp": { + "type": "string", + "enum": [ + "ARBEITSPREIS_WIRKARBEIT", + "LEISTUNGSPREIS_WIRKLEISTUNG", + "ARBEITSPREIS_BLINDARBEIT_IND", + "ARBEITSPREIS_BLINDARBEIT_KAP", + "GRUNDPREIS", + "MEHRMINDERMENGE", + "MESSSTELLENBETRIEB", + "MESSDIENSTLEISTUNG", + "MESSDIENSTLEISTUNG_INKL_MESSUNG", + "ABRECHNUNG", + "KONZESSIONS_ABGABE", + "KWK_UMLAGE", + "OFFSHORE_UMLAGE", + "ABLAV_UMLAGE", + "REGELENERGIE_UMLAGE", + "BILANZIERUNG_UMLAGE", + "AUSLESUNG_ZUSAETZLICH", + "ABLESUNG_ZUSAETZLICH", + "ABRECHNUNG_ZUSAETZLICH", + "SPERRUNG", + "ENTSPERRUNG", + "MAHNKOSTEN", + "INKASSOKOSTEN" + ] + }, + "leistungsbezeichung": { + "type": "string" + }, + "preiseinheit": { + "type": "string", + "enum": [ + "EUR", + "CT" + ] + }, + "bezugsgroesse": { + "type": "string", + "enum": [ + "WH", + "KW", + "ANZAHL", + "KUBIKMETER", + "STUNDE", + "TAG", + "MONAT", + "VAR", + "VARH", + "JAHR", + "KWH", + "MW", + "KVAR", + "KVARH", + "MWH" + ] + }, + "zeitbasis": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "SEKUNDE", + "MINUTE", + "STUNDE", + "VIERTEL_STUNDE", + "TAG", + "WOCHE", + "MONAT", + "QUARTAL", + "HALBJAHR", + "JAHR" + ] + }, + "tarifzeit": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "TZ_STANDARD", + "TZ_HT", + "TZ_NT" + ] + }, + "bdewArtikelnummer": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "LEISTUNG", + "LEISTUNG_PAUSCHAL", + "GRUNDPREIS", + "REGELENERGIE_ARBEIT", + "REGELENERGIE_LEISTUNG", + "NOTSTROMLIEFERUNG_ARBEIT", + "NOTSTROMLIEFERUNG_LEISTUNG", + "RESERVENETZKAPAZITAET", + "RESERVELEISTUNG", + "ZUSAETZLICHE_ABLESUNG", + "PRUEFGEBUEHREN_AUSSERPLANMAESSIG", + "WIRKARBEIT", + "SINGULAER_GENUTZTE_BETRIEBSMITTEL", + "ABGABE_KWKG", + "ABSCHLAG", + "KONZESSIONSABGABE", + "ENTGELT_FERNAUSLESUNG", + "UNTERMESSUNG", + "BLINDMEHRARBEIT", + "ENTGELT_ABRECHNUNG", + "SPERRKOSTEN", + "ENTSPERRKOSTEN", + "MAHNKOSTEN", + "MEHR_MINDERMENGEN", + "INKASSOKOSTEN", + "BLINDMEHRLEISTUNG", + "ENTGELT_MESSUNG_ABLESUNG", + "ENTGELT_EINBAU_BETRIEB_WARTUNG_MESSTECHNIK", + "AUSGLEICHSENERGIE", + "ZAEHLEINRICHTUNG", + "WANDLER_MENGENUMWERTER", + "KOMMUNIKATIONSEINRICHTUNG", + "TECHNISCHE_STEUEREINRICHTUNG", + "PARAGRAF_19_STROM_NEV_UMLAGE", + "BEFESTIGUNGSEINRICHTUNG", + "OFFSHORE_HAFTUNGSUMLAGE", + "FIXE_ARBEITSENTGELTKOMPONENTE", + "FIXE_LEISTUNGSENTGELTKOMPONENTE", + "UMLAGE_ABSCHALTBARE_LASTEN", + "MEHRMENGE", + "MINDERMENGE", + "ENERGIESTEUER", + "SMARTMETER_GATEWAY", + "STEUERBOX", + "MSB_INKL_MESSUNG" + ] + }, + "zonungsgroesse": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "WIRKARBEIT_EL", + "LEISTUNG_EL", + "BLINDARBEIT_KAP", + "BLINDARBEIT_IND", + "BLINDLEISTUNG_KAP", + "BLINDLEISTUNG_IND", + "WIRKARBEIT_TH", + "LEISTUNG_TH", + "VOLUMEN", + "VOLUMENSTROM", + "BENUTZUNGSDAUER", + "ANZAHL" + ] + }, + "zu_abschlaege": { + "$ref": "#/definitions/PositionsAufAbschlag" + }, + "preisstaffeln": { + "type": "array", + "items": { + "$ref": "#/definitions/Preisstaffel" + } + }, + "guid": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "berechnungsmethode", + "leistungstyp", + "leistungsbezeichung", + "preiseinheit", + "bezugsgroesse", + "preisstaffeln" + ] + }, + "Preisstaffel": { + "type": [ + "object", + "null" + ], + "properties": { + "einheitspreis": { + "type": "number" + }, + "staffelgrenzeVon": { + "type": "number" + }, + "staffelgrenzeBis": { + "type": "number" + }, + "sigmoidparameter": { + "$ref": "#/definitions/Sigmoidparameter" + }, + "guid": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "einheitspreis", + "staffelgrenzeVon", + "staffelgrenzeBis" + ] + }, + "Sigmoidparameter": { + "type": [ + "object", + "null" + ], + "properties": { + "A": { + "type": "number" + }, + "B": { + "type": "number" + }, + "C": { + "type": "number" + }, + "D": { + "type": "number" + }, + "guid": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "A", + "B", + "C", + "D" + ] + }, + "Zeitraum": { + "type": "object", + "properties": { + "einheit": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "SEKUNDE", + "MINUTE", + "STUNDE", + "VIERTEL_STUNDE", + "TAG", + "WOCHE", + "MONAT", + "QUARTAL", + "HALBJAHR", + "JAHR" + ] + }, + "dauer": { + "type": [ + "number", + "null" + ] + }, + "startdatum": { + "type": [ + "string", + "null" + ], + "format": "date-time" + }, + "enddatum": { + "type": [ + "string", + "null" + ], + "format": "date-time" + }, + "guid": { + "type": [ + "string", + "null" + ] + } + } + } + }, + "type": "object", + "properties": { + "guid": { + "type": [ + "string", + "null" + ] + }, + "boTyp": { + "type": [ + "string", + "null" + ] + }, + "versionStruktur": { + "type": "integer" + }, + "bezeichnung": { + "type": "string" + }, + "gueltigkeit": { + "$ref": "#/definitions/Zeitraum" + }, + "preispositionen": { + "type": "array", + "items": { + "$ref": "#/definitions/Preisposition" + } + }, + "sparte": { + "type": "string", + "enum": [ + "STROM", + "GAS", + "FERNWAERME", + "NAHWAERME", + "WASSER", + "ABWASSER" + ] + } + }, + "required": [ + "bezeichnung", + "gueltigkeit", + "preispositionen", + "sparte" + ] +} \ No newline at end of file diff --git a/json-schema-files/BO4E.BO.Rechnung.json b/json-schema-files/BO4E.BO.Rechnung.json new file mode 100644 index 00000000..146e8603 --- /dev/null +++ b/json-schema-files/BO4E.BO.Rechnung.json @@ -0,0 +1,1543 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "definitions": { + "Adresse": { + "type": [ + "object", + "null" + ], + "properties": { + "postleitzahl": { + "type": "string" + }, + "ort": { + "type": "string" + }, + "strasse": { + "type": [ + "string", + "null" + ] + }, + "hausnummer": { + "type": [ + "string", + "null" + ] + }, + "postfach": { + "type": [ + "string", + "null" + ] + }, + "adresszusatz": { + "type": [ + "string", + "null" + ] + }, + "coErgaenzung": { + "type": [ + "string", + "null" + ] + }, + "landescode": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "AC", + "AD", + "AE", + "AF", + "AG", + "AI", + "AL", + "AM", + "AN", + "AO", + "AQ", + "AR", + "AS", + "AT", + "AU", + "AW", + "AX", + "AZ", + "BA", + "BB", + "BD", + "BE", + "BF", + "BG", + "BH", + "BI", + "BJ", + "BL", + "BM", + "BN", + "BO", + "BQ", + "BR", + "BS", + "BT", + "BU", + "BV", + "BW", + "BY", + "BZ", + "CA", + "CC", + "CD", + "CF", + "CG", + "CH", + "CI", + "CK", + "CL", + "CM", + "CN", + "CO", + "CP", + "CR", + "CS", + "CU", + "CV", + "CW", + "CX", + "CY", + "CZ", + "DE", + "DG", + "DJ", + "DK", + "DM", + "DO", + "DZ", + "EA", + "EC", + "EE", + "EG", + "EH", + "ER", + "ES", + "ET", + "EU", + "FI", + "FJ", + "FK", + "FM", + "FO", + "FR", + "FX", + "GA", + "GB", + "GD", + "GE", + "GF", + "GG", + "GH", + "GI", + "GL", + "GM", + "GN", + "GP", + "GQ", + "GR", + "GS", + "GT", + "GU", + "GW", + "GY", + "HK", + "HM", + "HN", + "HR", + "HT", + "HU", + "IC", + "ID", + "IE", + "IL", + "IM", + "IN", + "IO", + "IQ", + "IR", + "IS", + "IT", + "JE", + "JM", + "JO", + "JP", + "KE", + "KG", + "KH", + "KI", + "KM", + "KN", + "KP", + "KR", + "KW", + "KY", + "KZ", + "LA", + "LB", + "LC", + "LI", + "LK", + "LR", + "LS", + "LT", + "LU", + "LV", + "LY", + "MA", + "MC", + "MD", + "ME", + "MF", + "MG", + "MH", + "MK", + "ML", + "MM", + "MN", + "MO", + "MP", + "MQ", + "MR", + "MS", + "MT", + "MU", + "MV", + "MW", + "MX", + "MY", + "MZ", + "NA", + "NC", + "NE", + "NF", + "NG", + "NI", + "NL", + "NO", + "NP", + "NR", + "NT", + "NU", + "NZ", + "OM", + "PA", + "PE", + "PF", + "PG", + "PH", + "PK", + "PL", + "PM", + "PN", + "PR", + "PS", + "PT", + "PW", + "PY", + "QA", + "RE", + "RO", + "RS", + "RU", + "RW", + "SA", + "SB", + "SC", + "SD", + "SE", + "SF", + "SG", + "SH", + "SI", + "SJ", + "SK", + "SL", + "SM", + "SN", + "SO", + "SR", + "SS", + "ST", + "SU", + "SV", + "SX", + "SY", + "SZ", + "TA", + "TC", + "TD", + "TF", + "TG", + "TJ", + "TK", + "TL", + "TM", + "TN", + "TO", + "TP", + "TR", + "TT", + "TV", + "TW", + "TZ", + "UA", + "UG", + "UK", + "UM", + "US", + "UY", + "UZ", + "VA", + "VC", + "VE", + "VG", + "VI", + "VN", + "VU", + "WF", + "WS", + "XK", + "YE", + "YT", + "YU", + "ZA", + "ZM", + "ZR", + "ZW" + ] + }, + "guid": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "postleitzahl", + "ort" + ] + }, + "Betrag": { + "type": "object", + "properties": { + "wert": { + "type": "number" + }, + "waehrung": { + "type": "string", + "enum": [ + "AFN", + "ALL", + "AMD", + "ANG", + "AOA", + "ARS", + "AUD", + "AWG", + "AZN", + "BAM", + "BBD", + "BDT", + "BGN", + "BHD", + "BIF", + "BMD", + "BND", + "BOB", + "BOV", + "BRL", + "BSD", + "BTN", + "BWP", + "BYN", + "BYR", + "BZD", + "CAD", + "CDF", + "CHE", + "CHF", + "CHW", + "CLF", + "CLP", + "CNY", + "COP", + "COU", + "CRC", + "CUC", + "CUP", + "CVE", + "CZK", + "DJF", + "DKK", + "DOP", + "DZD", + "EGP", + "ERN", + "ETB", + "EUR", + "FJD", + "FKP", + "GBP", + "GEL", + "GHS", + "GIP", + "GMD", + "GNF", + "GTQ", + "GYD", + "HKD", + "HNL", + "HRK", + "HTG", + "HUF", + "IDR", + "ILS", + "INR", + "IQD", + "IRR", + "ISK", + "JMD", + "JOD", + "JPY", + "KES", + "KGS", + "KHR", + "KMF", + "KPW", + "KRW", + "KWD", + "KYD", + "KZT", + "LAK", + "LBP", + "LKR", + "LRD", + "LSL", + "LTL", + "LYD", + "MAD", + "MDL", + "MGA", + "MKD", + "MMK", + "MNT", + "MOP", + "MRO", + "MUR", + "MVR", + "MWK", + "MXN", + "MXV", + "MYR", + "MZN", + "NAD", + "NGN", + "NIO", + "NOK", + "NPR", + "NZD", + "OMR", + "PAB", + "PEN", + "PGK", + "PHP", + "PKR", + "PLN", + "PYG", + "QAR", + "RON", + "RSD", + "RUB", + "RUR", + "RWF", + "SAR", + "SBD", + "SCR", + "SDG", + "SEK", + "SGD", + "SHP", + "SLL", + "SOS", + "SRD", + "SSP", + "STD", + "SVC", + "SYP", + "SZL", + "THB", + "TJS", + "TMT", + "TND", + "TOP", + "TRY", + "TTD", + "TWD", + "TZS", + "UAH", + "UGX", + "USD", + "USN", + "USS", + "UYI", + "UYU", + "UZS", + "VEF", + "VND", + "VUV", + "WST", + "XAF", + "XAG", + "XAU", + "XBA", + "XBB", + "XBC", + "XBD", + "XCD", + "XDR", + "XOF", + "XPD", + "XPF", + "XPT", + "XSU", + "XTS", + "XUA", + "XXX", + "YER", + "ZAR", + "ZMW", + "ZWL" + ] + }, + "guid": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "wert", + "waehrung" + ] + }, + "Betrag-1": { + "type": [ + "object", + "null" + ], + "properties": { + "wert": { + "type": "number" + }, + "waehrung": { + "type": "string", + "enum": [ + "AFN", + "ALL", + "AMD", + "ANG", + "AOA", + "ARS", + "AUD", + "AWG", + "AZN", + "BAM", + "BBD", + "BDT", + "BGN", + "BHD", + "BIF", + "BMD", + "BND", + "BOB", + "BOV", + "BRL", + "BSD", + "BTN", + "BWP", + "BYN", + "BYR", + "BZD", + "CAD", + "CDF", + "CHE", + "CHF", + "CHW", + "CLF", + "CLP", + "CNY", + "COP", + "COU", + "CRC", + "CUC", + "CUP", + "CVE", + "CZK", + "DJF", + "DKK", + "DOP", + "DZD", + "EGP", + "ERN", + "ETB", + "EUR", + "FJD", + "FKP", + "GBP", + "GEL", + "GHS", + "GIP", + "GMD", + "GNF", + "GTQ", + "GYD", + "HKD", + "HNL", + "HRK", + "HTG", + "HUF", + "IDR", + "ILS", + "INR", + "IQD", + "IRR", + "ISK", + "JMD", + "JOD", + "JPY", + "KES", + "KGS", + "KHR", + "KMF", + "KPW", + "KRW", + "KWD", + "KYD", + "KZT", + "LAK", + "LBP", + "LKR", + "LRD", + "LSL", + "LTL", + "LYD", + "MAD", + "MDL", + "MGA", + "MKD", + "MMK", + "MNT", + "MOP", + "MRO", + "MUR", + "MVR", + "MWK", + "MXN", + "MXV", + "MYR", + "MZN", + "NAD", + "NGN", + "NIO", + "NOK", + "NPR", + "NZD", + "OMR", + "PAB", + "PEN", + "PGK", + "PHP", + "PKR", + "PLN", + "PYG", + "QAR", + "RON", + "RSD", + "RUB", + "RUR", + "RWF", + "SAR", + "SBD", + "SCR", + "SDG", + "SEK", + "SGD", + "SHP", + "SLL", + "SOS", + "SRD", + "SSP", + "STD", + "SVC", + "SYP", + "SZL", + "THB", + "TJS", + "TMT", + "TND", + "TOP", + "TRY", + "TTD", + "TWD", + "TZS", + "UAH", + "UGX", + "USD", + "USN", + "USS", + "UYI", + "UYU", + "UZS", + "VEF", + "VND", + "VUV", + "WST", + "XAF", + "XAG", + "XAU", + "XBA", + "XBB", + "XBC", + "XBD", + "XCD", + "XDR", + "XOF", + "XPD", + "XPF", + "XPT", + "XSU", + "XTS", + "XUA", + "XXX", + "YER", + "ZAR", + "ZMW", + "ZWL" + ] + }, + "guid": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "wert", + "waehrung" + ] + }, + "Geschaeftspartner": { + "type": "object", + "properties": { + "guid": { + "type": [ + "string", + "null" + ] + }, + "boTyp": { + "type": [ + "string", + "null" + ] + }, + "versionStruktur": { + "type": "integer" + }, + "anrede": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "HERR", + "FRAU", + "EHELEUTE", + "FIRMA", + "INDIVIDUELL", + "DR" + ] + }, + "title": { + "type": [ + "string", + "null" + ] + }, + "name1": { + "type": [ + "string", + "null" + ] + }, + "name2": { + "type": [ + "string", + "null" + ] + }, + "name3": { + "type": [ + "string", + "null" + ] + }, + "gewerbekennzeichnung": { + "type": "boolean" + }, + "hrnummer": { + "type": [ + "string", + "null" + ] + }, + "amtsgericht": { + "type": [ + "string", + "null" + ] + }, + "kontaktweg": { + "type": [ + "array", + "null" + ], + "items": { + "type": "string", + "enum": [ + "ANSCHREIBEN", + "TELEFONAT", + "FAX", + "E_MAIL", + "SMS" + ] + } + }, + "umsatzsteuerId": { + "type": [ + "string", + "null" + ] + }, + "glaeubigerId": { + "type": [ + "string", + "null" + ] + }, + "eMailAdresse": { + "type": [ + "string", + "null" + ] + }, + "website": { + "type": [ + "string", + "null" + ] + }, + "geschaeftspartnerrolle": { + "type": [ + "array", + "null" + ], + "items": { + "type": "string", + "enum": [ + "LIEFERANT", + "DIENSTLEISTER", + "KUNDE", + "INTERESSENT", + "MARKTPARTNER" + ] + } + }, + "partneradresse": { + "$ref": "#/definitions/Adresse" + } + }, + "required": [ + "gewerbekennzeichnung" + ] + }, + "Menge": { + "type": [ + "object", + "null" + ], + "properties": { + "wert": { + "type": "number" + }, + "einheit": { + "type": "string", + "enum": [ + "WH", + "KW", + "ANZAHL", + "KUBIKMETER", + "STUNDE", + "TAG", + "MONAT", + "VAR", + "VARH", + "JAHR", + "KWH", + "MW", + "KVAR", + "KVARH", + "MWH" + ] + }, + "guid": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "wert", + "einheit" + ] + }, + "Preis": { + "type": "object", + "properties": { + "wert": { + "type": "number" + }, + "einheit": { + "type": "string", + "enum": [ + "EUR", + "CT" + ] + }, + "bezugswert": { + "type": "string", + "enum": [ + "WH", + "KW", + "ANZAHL", + "KUBIKMETER", + "STUNDE", + "TAG", + "MONAT", + "VAR", + "VARH", + "JAHR", + "KWH", + "MW", + "KVAR", + "KVARH", + "MWH" + ] + }, + "status": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "VORLAEUFIG", + "ENDGUELTIG" + ] + }, + "guid": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "wert", + "einheit", + "bezugswert" + ] + }, + "Rechnungsposition": { + "type": [ + "object", + "null" + ], + "properties": { + "positionsnummer": { + "type": "integer" + }, + "lieferungVon": { + "type": "string", + "format": "date-time" + }, + "lieferungBis": { + "type": "string", + "format": "date-time" + }, + "positionstext": { + "type": "string" + }, + "zeiteinheit": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "WH", + "KW", + "ANZAHL", + "KUBIKMETER", + "STUNDE", + "TAG", + "MONAT", + "VAR", + "VARH", + "JAHR", + "KWH", + "MW", + "KVAR", + "KVARH", + "MWH" + ] + }, + "artikelnummer": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "LEISTUNG", + "LEISTUNG_PAUSCHAL", + "GRUNDPREIS", + "REGELENERGIE_ARBEIT", + "REGELENERGIE_LEISTUNG", + "NOTSTROMLIEFERUNG_ARBEIT", + "NOTSTROMLIEFERUNG_LEISTUNG", + "RESERVENETZKAPAZITAET", + "RESERVELEISTUNG", + "ZUSAETZLICHE_ABLESUNG", + "PRUEFGEBUEHREN_AUSSERPLANMAESSIG", + "WIRKARBEIT", + "SINGULAER_GENUTZTE_BETRIEBSMITTEL", + "ABGABE_KWKG", + "ABSCHLAG", + "KONZESSIONSABGABE", + "ENTGELT_FERNAUSLESUNG", + "UNTERMESSUNG", + "BLINDMEHRARBEIT", + "ENTGELT_ABRECHNUNG", + "SPERRKOSTEN", + "ENTSPERRKOSTEN", + "MAHNKOSTEN", + "MEHR_MINDERMENGEN", + "INKASSOKOSTEN", + "BLINDMEHRLEISTUNG", + "ENTGELT_MESSUNG_ABLESUNG", + "ENTGELT_EINBAU_BETRIEB_WARTUNG_MESSTECHNIK", + "AUSGLEICHSENERGIE", + "ZAEHLEINRICHTUNG", + "WANDLER_MENGENUMWERTER", + "KOMMUNIKATIONSEINRICHTUNG", + "TECHNISCHE_STEUEREINRICHTUNG", + "PARAGRAF_19_STROM_NEV_UMLAGE", + "BEFESTIGUNGSEINRICHTUNG", + "OFFSHORE_HAFTUNGSUMLAGE", + "FIXE_ARBEITSENTGELTKOMPONENTE", + "FIXE_LEISTUNGSENTGELTKOMPONENTE", + "UMLAGE_ABSCHALTBARE_LASTEN", + "MEHRMENGE", + "MINDERMENGE", + "ENERGIESTEUER", + "SMARTMETER_GATEWAY", + "STEUERBOX", + "MSB_INKL_MESSUNG" + ] + }, + "lokationsId": { + "type": [ + "string", + "null" + ] + }, + "positionsMenge": { + "$ref": "#/definitions/Menge" + }, + "zeitbezogeneMenge": { + "$ref": "#/definitions/Menge" + }, + "einzelpreis": { + "$ref": "#/definitions/Preis" + }, + "teilsummeNetto": { + "$ref": "#/definitions/Betrag-1" + }, + "teilrabattNetto": { + "$ref": "#/definitions/Betrag-1" + }, + "teilsummeSteuer": { + "$ref": "#/definitions/Steuerbetrag" + }, + "vertragskontoId": { + "type": [ + "string", + "null" + ] + }, + "vertragsId": { + "type": [ + "string", + "null" + ] + }, + "status": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "ROH", + "ROH_AUSGENOMMEN", + "ABRECHENBAR", + "ABRECHENBAR_AUSGENOMMEN", + "ABGERECHNET" + ] + }, + "guid": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "positionsnummer", + "lieferungVon", + "lieferungBis", + "positionstext", + "einzelpreis" + ] + }, + "Steuerbetrag": { + "type": [ + "object", + "null" + ], + "properties": { + "steuerkennzeichen": { + "type": "string", + "enum": [ + "UST_19", + "UST_7", + "VST_0", + "VST_19", + "VST_7", + "RCV" + ] + }, + "basiswert": { + "type": "number" + }, + "steuerwert": { + "type": "number" + }, + "waehrung": { + "type": "string", + "enum": [ + "AFN", + "ALL", + "AMD", + "ANG", + "AOA", + "ARS", + "AUD", + "AWG", + "AZN", + "BAM", + "BBD", + "BDT", + "BGN", + "BHD", + "BIF", + "BMD", + "BND", + "BOB", + "BOV", + "BRL", + "BSD", + "BTN", + "BWP", + "BYN", + "BYR", + "BZD", + "CAD", + "CDF", + "CHE", + "CHF", + "CHW", + "CLF", + "CLP", + "CNY", + "COP", + "COU", + "CRC", + "CUC", + "CUP", + "CVE", + "CZK", + "DJF", + "DKK", + "DOP", + "DZD", + "EGP", + "ERN", + "ETB", + "EUR", + "FJD", + "FKP", + "GBP", + "GEL", + "GHS", + "GIP", + "GMD", + "GNF", + "GTQ", + "GYD", + "HKD", + "HNL", + "HRK", + "HTG", + "HUF", + "IDR", + "ILS", + "INR", + "IQD", + "IRR", + "ISK", + "JMD", + "JOD", + "JPY", + "KES", + "KGS", + "KHR", + "KMF", + "KPW", + "KRW", + "KWD", + "KYD", + "KZT", + "LAK", + "LBP", + "LKR", + "LRD", + "LSL", + "LTL", + "LYD", + "MAD", + "MDL", + "MGA", + "MKD", + "MMK", + "MNT", + "MOP", + "MRO", + "MUR", + "MVR", + "MWK", + "MXN", + "MXV", + "MYR", + "MZN", + "NAD", + "NGN", + "NIO", + "NOK", + "NPR", + "NZD", + "OMR", + "PAB", + "PEN", + "PGK", + "PHP", + "PKR", + "PLN", + "PYG", + "QAR", + "RON", + "RSD", + "RUB", + "RUR", + "RWF", + "SAR", + "SBD", + "SCR", + "SDG", + "SEK", + "SGD", + "SHP", + "SLL", + "SOS", + "SRD", + "SSP", + "STD", + "SVC", + "SYP", + "SZL", + "THB", + "TJS", + "TMT", + "TND", + "TOP", + "TRY", + "TTD", + "TWD", + "TZS", + "UAH", + "UGX", + "USD", + "USN", + "USS", + "UYI", + "UYU", + "UZS", + "VEF", + "VND", + "VUV", + "WST", + "XAF", + "XAG", + "XAU", + "XBA", + "XBB", + "XBC", + "XBD", + "XCD", + "XDR", + "XOF", + "XPD", + "XPF", + "XPT", + "XSU", + "XTS", + "XUA", + "XXX", + "YER", + "ZAR", + "ZMW", + "ZWL" + ] + }, + "guid": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "steuerkennzeichen", + "basiswert", + "steuerwert", + "waehrung" + ] + }, + "Zeitraum": { + "type": "object", + "properties": { + "einheit": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "SEKUNDE", + "MINUTE", + "STUNDE", + "VIERTEL_STUNDE", + "TAG", + "WOCHE", + "MONAT", + "QUARTAL", + "HALBJAHR", + "JAHR" + ] + }, + "dauer": { + "type": [ + "number", + "null" + ] + }, + "startdatum": { + "type": [ + "string", + "null" + ], + "format": "date-time" + }, + "enddatum": { + "type": [ + "string", + "null" + ], + "format": "date-time" + }, + "guid": { + "type": [ + "string", + "null" + ] + } + } + } + }, + "type": "object", + "properties": { + "guid": { + "type": [ + "string", + "null" + ] + }, + "boTyp": { + "type": [ + "string", + "null" + ] + }, + "versionStruktur": { + "type": "integer" + }, + "rechnungstitel": { + "type": [ + "string", + "null" + ] + }, + "rechnungsstatus": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "GEPRUEFT_OK", + "GEPRUEFT_FEHLERHAFT", + "GEBUCHT", + "BEZAHLT" + ] + }, + "storno": { + "type": "boolean" + }, + "rechnungsnummer": { + "type": "string" + }, + "rechnungsdatum": { + "type": "string", + "format": "date-time" + }, + "faelligkeitsdatum": { + "type": "string", + "format": "date-time" + }, + "rechnungstyp": { + "type": "string", + "enum": [ + "ABSCHLAGSRECHNUNG", + "TURNUSRECHNUNG", + "MONATSRECHNUNG", + "WIMRECHNUNG", + "ZWISCHENRECHNUNG", + "INTEGRIERTE_13TE_RECHNUNG", + "ZUSAETZLICHE_13TE_RECHNUNG", + "MEHRMINDERMENGENRECHNUNG" + ] + }, + "originalRechnungsnummer": { + "type": [ + "string", + "null" + ] + }, + "rechnungsperiode": { + "$ref": "#/definitions/Zeitraum" + }, + "rechnungsersteller": { + "$ref": "#/definitions/Geschaeftspartner" + }, + "rechnungsempfaenger": { + "$ref": "#/definitions/Geschaeftspartner" + }, + "gesamtnetto": { + "$ref": "#/definitions/Betrag" + }, + "gesamtsteuer": { + "$ref": "#/definitions/Betrag" + }, + "gesamtbrutto": { + "$ref": "#/definitions/Betrag" + }, + "vorausgezahlt": { + "$ref": "#/definitions/Betrag-1" + }, + "rabattBrutto": { + "$ref": "#/definitions/Betrag-1" + }, + "zuzahlen": { + "$ref": "#/definitions/Betrag" + }, + "steuerbetraege": { + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Steuerbetrag" + } + }, + "rechnungspositionen": { + "type": "array", + "items": { + "$ref": "#/definitions/Rechnungsposition" + } + } + }, + "required": [ + "storno", + "rechnungsnummer", + "rechnungsdatum", + "faelligkeitsdatum", + "rechnungstyp", + "rechnungsperiode", + "rechnungsersteller", + "rechnungsempfaenger", + "gesamtnetto", + "gesamtsteuer", + "gesamtbrutto", + "zuzahlen", + "rechnungspositionen" + ] +} \ No newline at end of file diff --git a/json-schema-files/BO4E.BO.Region.json b/json-schema-files/BO4E.BO.Region.json new file mode 100644 index 00000000..043a654b --- /dev/null +++ b/json-schema-files/BO4E.BO.Region.json @@ -0,0 +1,127 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "definitions": { + "Regionskriterium": { + "type": [ + "object", + "null" + ], + "properties": { + "gueltigkeitstyp": { + "type": "string", + "enum": [ + "NICHT_IN" + ] + }, + "sparte": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "STROM", + "GAS", + "FERNWAERME", + "NAHWAERME", + "WASSER", + "ABWASSER" + ] + }, + "mengenoperator": { + "type": "string", + "enum": [ + "KLEINER_ALS", + "GROESSER_ALS", + "GLEICH" + ] + }, + "regionskriteriumtyp": { + "type": "string", + "enum": [ + "BUNDESLANDKENNZIFFER", + "BUNDESLAND_NAME", + "MARKTGEBIET_NUMMER", + "MARKTGEBIET_NAME", + "REGELGEBIET_NUMMER", + "REGELGEBIET_NAME", + "NETZBETREIBER_NUMMER", + "NETZBETREIBER_NAME", + "BILANZIERUNGS_GEBIET_NUMMER", + "MSB_NUMMER", + "MSB_NAME", + "VERSORGER_NUMMER", + "VERSORGER_NAME", + "GRUNDVERSORGER_NUMMER", + "GRUNDVERSORGER_NAME", + "KREIS_NAME", + "KREISKENNZIFFER", + "GEMEINDE_NAME", + "GEMEINDEKENNZIFFER", + "POSTLEITZAHL", + "ORT", + "EINWOHNERZAHL_GEMEINDE", + "EINWOHNERZAHL_ORT", + "KM_UMKREIS", + "BUNDESWEIT" + ] + }, + "wert": { + "type": "string" + }, + "guid": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "gueltigkeitstyp", + "mengenoperator", + "regionskriteriumtyp", + "wert" + ] + } + }, + "type": "object", + "properties": { + "guid": { + "type": [ + "string", + "null" + ] + }, + "boTyp": { + "type": [ + "string", + "null" + ] + }, + "versionStruktur": { + "type": "integer" + }, + "bezeichnung": { + "type": "string" + }, + "positivListe": { + "type": "array", + "items": { + "$ref": "#/definitions/Regionskriterium" + } + }, + "negativListe": { + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Regionskriterium" + } + } + }, + "required": [ + "bezeichnung", + "positivListe" + ] +} \ No newline at end of file diff --git a/json-schema-files/BO4E.BO.Vertrag.json b/json-schema-files/BO4E.BO.Vertrag.json new file mode 100644 index 00000000..d382d952 --- /dev/null +++ b/json-schema-files/BO4E.BO.Vertrag.json @@ -0,0 +1,890 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "definitions": { + "Adresse": { + "type": [ + "object", + "null" + ], + "properties": { + "postleitzahl": { + "type": "string" + }, + "ort": { + "type": "string" + }, + "strasse": { + "type": [ + "string", + "null" + ] + }, + "hausnummer": { + "type": [ + "string", + "null" + ] + }, + "postfach": { + "type": [ + "string", + "null" + ] + }, + "adresszusatz": { + "type": [ + "string", + "null" + ] + }, + "coErgaenzung": { + "type": [ + "string", + "null" + ] + }, + "landescode": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "AC", + "AD", + "AE", + "AF", + "AG", + "AI", + "AL", + "AM", + "AN", + "AO", + "AQ", + "AR", + "AS", + "AT", + "AU", + "AW", + "AX", + "AZ", + "BA", + "BB", + "BD", + "BE", + "BF", + "BG", + "BH", + "BI", + "BJ", + "BL", + "BM", + "BN", + "BO", + "BQ", + "BR", + "BS", + "BT", + "BU", + "BV", + "BW", + "BY", + "BZ", + "CA", + "CC", + "CD", + "CF", + "CG", + "CH", + "CI", + "CK", + "CL", + "CM", + "CN", + "CO", + "CP", + "CR", + "CS", + "CU", + "CV", + "CW", + "CX", + "CY", + "CZ", + "DE", + "DG", + "DJ", + "DK", + "DM", + "DO", + "DZ", + "EA", + "EC", + "EE", + "EG", + "EH", + "ER", + "ES", + "ET", + "EU", + "FI", + "FJ", + "FK", + "FM", + "FO", + "FR", + "FX", + "GA", + "GB", + "GD", + "GE", + "GF", + "GG", + "GH", + "GI", + "GL", + "GM", + "GN", + "GP", + "GQ", + "GR", + "GS", + "GT", + "GU", + "GW", + "GY", + "HK", + "HM", + "HN", + "HR", + "HT", + "HU", + "IC", + "ID", + "IE", + "IL", + "IM", + "IN", + "IO", + "IQ", + "IR", + "IS", + "IT", + "JE", + "JM", + "JO", + "JP", + "KE", + "KG", + "KH", + "KI", + "KM", + "KN", + "KP", + "KR", + "KW", + "KY", + "KZ", + "LA", + "LB", + "LC", + "LI", + "LK", + "LR", + "LS", + "LT", + "LU", + "LV", + "LY", + "MA", + "MC", + "MD", + "ME", + "MF", + "MG", + "MH", + "MK", + "ML", + "MM", + "MN", + "MO", + "MP", + "MQ", + "MR", + "MS", + "MT", + "MU", + "MV", + "MW", + "MX", + "MY", + "MZ", + "NA", + "NC", + "NE", + "NF", + "NG", + "NI", + "NL", + "NO", + "NP", + "NR", + "NT", + "NU", + "NZ", + "OM", + "PA", + "PE", + "PF", + "PG", + "PH", + "PK", + "PL", + "PM", + "PN", + "PR", + "PS", + "PT", + "PW", + "PY", + "QA", + "RE", + "RO", + "RS", + "RU", + "RW", + "SA", + "SB", + "SC", + "SD", + "SE", + "SF", + "SG", + "SH", + "SI", + "SJ", + "SK", + "SL", + "SM", + "SN", + "SO", + "SR", + "SS", + "ST", + "SU", + "SV", + "SX", + "SY", + "SZ", + "TA", + "TC", + "TD", + "TF", + "TG", + "TJ", + "TK", + "TL", + "TM", + "TN", + "TO", + "TP", + "TR", + "TT", + "TV", + "TW", + "TZ", + "UA", + "UG", + "UK", + "UM", + "US", + "UY", + "UZ", + "VA", + "VC", + "VE", + "VG", + "VI", + "VN", + "VU", + "WF", + "WS", + "XK", + "YE", + "YT", + "YU", + "ZA", + "ZM", + "ZR", + "ZW" + ] + }, + "guid": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "postleitzahl", + "ort" + ] + }, + "Geschaeftspartner": { + "type": [ + "object", + "null" + ], + "properties": { + "guid": { + "type": [ + "string", + "null" + ] + }, + "boTyp": { + "type": [ + "string", + "null" + ] + }, + "versionStruktur": { + "type": "integer" + }, + "anrede": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "HERR", + "FRAU", + "EHELEUTE", + "FIRMA", + "INDIVIDUELL", + "DR" + ] + }, + "title": { + "type": [ + "string", + "null" + ] + }, + "name1": { + "type": [ + "string", + "null" + ] + }, + "name2": { + "type": [ + "string", + "null" + ] + }, + "name3": { + "type": [ + "string", + "null" + ] + }, + "gewerbekennzeichnung": { + "type": "boolean" + }, + "hrnummer": { + "type": [ + "string", + "null" + ] + }, + "amtsgericht": { + "type": [ + "string", + "null" + ] + }, + "kontaktweg": { + "type": [ + "array", + "null" + ], + "items": { + "type": "string", + "enum": [ + "ANSCHREIBEN", + "TELEFONAT", + "FAX", + "E_MAIL", + "SMS" + ] + } + }, + "umsatzsteuerId": { + "type": [ + "string", + "null" + ] + }, + "glaeubigerId": { + "type": [ + "string", + "null" + ] + }, + "eMailAdresse": { + "type": [ + "string", + "null" + ] + }, + "website": { + "type": [ + "string", + "null" + ] + }, + "geschaeftspartnerrolle": { + "type": [ + "array", + "null" + ], + "items": { + "type": "string", + "enum": [ + "LIEFERANT", + "DIENSTLEISTER", + "KUNDE", + "INTERESSENT", + "MARKTPARTNER" + ] + } + }, + "partneradresse": { + "$ref": "#/definitions/Adresse" + } + }, + "required": [ + "gewerbekennzeichnung" + ] + }, + "Menge": { + "type": [ + "object", + "null" + ], + "properties": { + "wert": { + "type": "number" + }, + "einheit": { + "type": "string", + "enum": [ + "WH", + "KW", + "ANZAHL", + "KUBIKMETER", + "STUNDE", + "TAG", + "MONAT", + "VAR", + "VARH", + "JAHR", + "KWH", + "MW", + "KVAR", + "KVARH", + "MWH" + ] + }, + "guid": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "wert", + "einheit" + ] + }, + "Unterschrift": { + "type": [ + "object", + "null" + ], + "properties": { + "ort": { + "type": [ + "string", + "null" + ] + }, + "datum": { + "type": [ + "string", + "null" + ], + "format": "date-time" + }, + "name": { + "type": "string" + }, + "guid": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "name" + ] + }, + "Vertragskonditionen": { + "type": [ + "object", + "null" + ], + "properties": { + "beschreibung": { + "type": [ + "string", + "null" + ] + }, + "anzahlAbschlaege": { + "type": [ + "integer", + "null" + ] + }, + "vertragslaufzeit": { + "$ref": "#/definitions/Zeitraum" + }, + "kuendigungsfrist": { + "$ref": "#/definitions/Zeitraum" + }, + "vertragsverlaengerung": { + "$ref": "#/definitions/Zeitraum" + }, + "abschlagszyklus": { + "$ref": "#/definitions/Zeitraum" + }, + "startAbrechnungsjahr": { + "type": [ + "string", + "null" + ], + "format": "date-time" + }, + "geplanteTurnusablesung": { + "$ref": "#/definitions/Zeitraum" + }, + "turnusablesungIntervall": { + "type": [ + "integer", + "null" + ] + }, + "netznutzungsabrechnung": { + "$ref": "#/definitions/Zeitraum" + }, + "netznutzungsabrechnungIntervall": { + "type": [ + "integer", + "null" + ] + }, + "haushaltskunde": { + "type": [ + "boolean", + "null" + ] + }, + "netznutzungsvertrag": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "KUNDEN_NB", + "LIEFERANTEN_NB" + ] + }, + "netznutzungszahler": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "KUNDE", + "LIEFERANT" + ] + }, + "netznutzungsabrechnungsvariante": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "ARBEITSPREIS_GRUNDPREIS", + "ARBEITSPREIS_LEISTUNGSPREIS" + ] + }, + "netznutzungsabrechnungsgrundlage": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "LIEFERSCHEIN", + "ABWEICHENDE_GRUNDLAGE" + ] + }, + "guid": { + "type": [ + "string", + "null" + ] + } + } + }, + "Vertragsteil": { + "type": [ + "object", + "null" + ], + "properties": { + "vertragsteilbeginn": { + "type": "string", + "format": "date-time" + }, + "vertragsteilende": { + "type": "string", + "format": "date-time" + }, + "lokation": { + "type": [ + "string", + "null" + ] + }, + "vertraglichFixierteMenge": { + "$ref": "#/definitions/Menge" + }, + "minimaleAbnahmemenge": { + "$ref": "#/definitions/Menge" + }, + "maximaleAbnahmemenge": { + "$ref": "#/definitions/Menge" + }, + "jahresverbrauchsprognose": { + "$ref": "#/definitions/Menge" + }, + "kundenwert": { + "$ref": "#/definitions/Menge" + }, + "verbrauchsaufteilung": { + "type": [ + "string", + "null" + ] + }, + "guid": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "vertragsteilbeginn", + "vertragsteilende" + ] + }, + "Zeitraum": { + "type": [ + "object", + "null" + ], + "properties": { + "einheit": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "SEKUNDE", + "MINUTE", + "STUNDE", + "VIERTEL_STUNDE", + "TAG", + "WOCHE", + "MONAT", + "QUARTAL", + "HALBJAHR", + "JAHR" + ] + }, + "dauer": { + "type": [ + "number", + "null" + ] + }, + "startdatum": { + "type": [ + "string", + "null" + ], + "format": "date-time" + }, + "enddatum": { + "type": [ + "string", + "null" + ], + "format": "date-time" + }, + "guid": { + "type": [ + "string", + "null" + ] + } + } + } + }, + "type": "object", + "properties": { + "guid": { + "type": [ + "string", + "null" + ] + }, + "boTyp": { + "type": [ + "string", + "null" + ] + }, + "versionStruktur": { + "type": "integer" + }, + "vertragsnummer": { + "type": "string" + }, + "beschreibung": { + "type": [ + "string", + "null" + ] + }, + "vertragsart": { + "type": "string", + "enum": [ + "ENERGIELIEFERVERTRAG", + "NETZNUTZUNGSVERTRAG", + "BILANZIERUNGSVERTRAG", + "MESSSTELLENBETRIEBSVERTRAG", + "BUENDELVERTRAG" + ] + }, + "vertragstatus": { + "type": "string", + "enum": [ + "IN_ARBEIT", + "UEBERMITTELT", + "ANGENOMMEN", + "AKTIV", + "ABGELEHNT", + "WIDERRUFEN", + "STORNIERT", + "GEKUENDIGT", + "BEENDET" + ] + }, + "sparte": { + "type": "string", + "enum": [ + "STROM", + "GAS", + "FERNWAERME", + "NAHWAERME", + "WASSER", + "ABWASSER" + ] + }, + "vertragsbeginn": { + "type": "string", + "format": "date-time" + }, + "vertragsende": { + "type": "string", + "format": "date-time" + }, + "vertragspartner1": { + "$ref": "#/definitions/Geschaeftspartner" + }, + "vertragspartner2": { + "$ref": "#/definitions/Geschaeftspartner" + }, + "unterzeichnervp1": { + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Unterschrift" + } + }, + "unterzeichnervp2": { + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Unterschrift" + } + }, + "vertragskonditionen": { + "$ref": "#/definitions/Vertragskonditionen" + }, + "vertragsteile": { + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Vertragsteil" + } + }, + "gemeinderabatt": { + "type": [ + "number", + "null" + ] + }, + "korrespondenzpartner": { + "$ref": "#/definitions/Geschaeftspartner" + } + }, + "required": [ + "vertragsnummer", + "vertragsart", + "vertragstatus", + "sparte", + "vertragsbeginn", + "vertragsende" + ] +} \ No newline at end of file diff --git a/json-schema-files/BO4E.BO.Zaehler.json b/json-schema-files/BO4E.BO.Zaehler.json new file mode 100644 index 00000000..81daba33 --- /dev/null +++ b/json-schema-files/BO4E.BO.Zaehler.json @@ -0,0 +1,790 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "definitions": { + "Adresse": { + "type": [ + "object", + "null" + ], + "properties": { + "postleitzahl": { + "type": "string" + }, + "ort": { + "type": "string" + }, + "strasse": { + "type": [ + "string", + "null" + ] + }, + "hausnummer": { + "type": [ + "string", + "null" + ] + }, + "postfach": { + "type": [ + "string", + "null" + ] + }, + "adresszusatz": { + "type": [ + "string", + "null" + ] + }, + "coErgaenzung": { + "type": [ + "string", + "null" + ] + }, + "landescode": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "AC", + "AD", + "AE", + "AF", + "AG", + "AI", + "AL", + "AM", + "AN", + "AO", + "AQ", + "AR", + "AS", + "AT", + "AU", + "AW", + "AX", + "AZ", + "BA", + "BB", + "BD", + "BE", + "BF", + "BG", + "BH", + "BI", + "BJ", + "BL", + "BM", + "BN", + "BO", + "BQ", + "BR", + "BS", + "BT", + "BU", + "BV", + "BW", + "BY", + "BZ", + "CA", + "CC", + "CD", + "CF", + "CG", + "CH", + "CI", + "CK", + "CL", + "CM", + "CN", + "CO", + "CP", + "CR", + "CS", + "CU", + "CV", + "CW", + "CX", + "CY", + "CZ", + "DE", + "DG", + "DJ", + "DK", + "DM", + "DO", + "DZ", + "EA", + "EC", + "EE", + "EG", + "EH", + "ER", + "ES", + "ET", + "EU", + "FI", + "FJ", + "FK", + "FM", + "FO", + "FR", + "FX", + "GA", + "GB", + "GD", + "GE", + "GF", + "GG", + "GH", + "GI", + "GL", + "GM", + "GN", + "GP", + "GQ", + "GR", + "GS", + "GT", + "GU", + "GW", + "GY", + "HK", + "HM", + "HN", + "HR", + "HT", + "HU", + "IC", + "ID", + "IE", + "IL", + "IM", + "IN", + "IO", + "IQ", + "IR", + "IS", + "IT", + "JE", + "JM", + "JO", + "JP", + "KE", + "KG", + "KH", + "KI", + "KM", + "KN", + "KP", + "KR", + "KW", + "KY", + "KZ", + "LA", + "LB", + "LC", + "LI", + "LK", + "LR", + "LS", + "LT", + "LU", + "LV", + "LY", + "MA", + "MC", + "MD", + "ME", + "MF", + "MG", + "MH", + "MK", + "ML", + "MM", + "MN", + "MO", + "MP", + "MQ", + "MR", + "MS", + "MT", + "MU", + "MV", + "MW", + "MX", + "MY", + "MZ", + "NA", + "NC", + "NE", + "NF", + "NG", + "NI", + "NL", + "NO", + "NP", + "NR", + "NT", + "NU", + "NZ", + "OM", + "PA", + "PE", + "PF", + "PG", + "PH", + "PK", + "PL", + "PM", + "PN", + "PR", + "PS", + "PT", + "PW", + "PY", + "QA", + "RE", + "RO", + "RS", + "RU", + "RW", + "SA", + "SB", + "SC", + "SD", + "SE", + "SF", + "SG", + "SH", + "SI", + "SJ", + "SK", + "SL", + "SM", + "SN", + "SO", + "SR", + "SS", + "ST", + "SU", + "SV", + "SX", + "SY", + "SZ", + "TA", + "TC", + "TD", + "TF", + "TG", + "TJ", + "TK", + "TL", + "TM", + "TN", + "TO", + "TP", + "TR", + "TT", + "TV", + "TW", + "TZ", + "UA", + "UG", + "UK", + "UM", + "US", + "UY", + "UZ", + "VA", + "VC", + "VE", + "VG", + "VI", + "VN", + "VU", + "WF", + "WS", + "XK", + "YE", + "YT", + "YU", + "ZA", + "ZM", + "ZR", + "ZW" + ] + }, + "guid": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "postleitzahl", + "ort" + ] + }, + "Geschaeftspartner": { + "type": [ + "object", + "null" + ], + "properties": { + "guid": { + "type": [ + "string", + "null" + ] + }, + "boTyp": { + "type": [ + "string", + "null" + ] + }, + "versionStruktur": { + "type": "integer" + }, + "anrede": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "HERR", + "FRAU", + "EHELEUTE", + "FIRMA", + "INDIVIDUELL", + "DR" + ] + }, + "title": { + "type": [ + "string", + "null" + ] + }, + "name1": { + "type": [ + "string", + "null" + ] + }, + "name2": { + "type": [ + "string", + "null" + ] + }, + "name3": { + "type": [ + "string", + "null" + ] + }, + "gewerbekennzeichnung": { + "type": "boolean" + }, + "hrnummer": { + "type": [ + "string", + "null" + ] + }, + "amtsgericht": { + "type": [ + "string", + "null" + ] + }, + "kontaktweg": { + "type": [ + "array", + "null" + ], + "items": { + "type": "string", + "enum": [ + "ANSCHREIBEN", + "TELEFONAT", + "FAX", + "E_MAIL", + "SMS" + ] + } + }, + "umsatzsteuerId": { + "type": [ + "string", + "null" + ] + }, + "glaeubigerId": { + "type": [ + "string", + "null" + ] + }, + "eMailAdresse": { + "type": [ + "string", + "null" + ] + }, + "website": { + "type": [ + "string", + "null" + ] + }, + "geschaeftspartnerrolle": { + "type": [ + "array", + "null" + ], + "items": { + "type": "string", + "enum": [ + "LIEFERANT", + "DIENSTLEISTER", + "KUNDE", + "INTERESSENT", + "MARKTPARTNER" + ] + } + }, + "partneradresse": { + "$ref": "#/definitions/Adresse" + } + }, + "required": [ + "gewerbekennzeichnung" + ] + }, + "Konzessionsabgabe": { + "type": [ + "object", + "null" + ], + "properties": { + "guid": { + "type": [ + "string", + "null" + ] + }, + "kosten": { + "type": "number" + }, + "kategorie": { + "type": "string" + }, + "satz": { + "type": "string", + "enum": [ + "KAS", + "SA", + "SAS", + "TA", + "TAS", + "TK", + "TKS", + "TS", + "TSS" + ] + } + }, + "required": [ + "kosten", + "kategorie", + "satz" + ] + }, + "Zaehlwerk": { + "type": [ + "object", + "null" + ], + "properties": { + "zaehlwerkId": { + "type": "string" + }, + "bezeichnung": { + "type": "string" + }, + "richtung": { + "type": "string", + "enum": [ + "AUSSP", + "EINSP" + ] + }, + "obisKennzahl": { + "type": "string" + }, + "wandlerfaktor": { + "type": "number" + }, + "einheit": { + "type": "string", + "enum": [ + "WH", + "KW", + "ANZAHL", + "KUBIKMETER", + "STUNDE", + "TAG", + "MONAT", + "VAR", + "VARH", + "JAHR", + "KWH", + "MW", + "KVAR", + "KVARH", + "MWH" + ] + }, + "kennzahl": { + "type": [ + "string", + "null" + ] + }, + "schwachlastfaehig": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "NICHT_SCHWACHLASTFAEHIG", + "SCHWACHLASTFAEHIG" + ] + }, + "verwendungszwecke": { + "type": [ + "array", + "null" + ], + "items": { + "type": "string", + "enum": [ + "NETZNUTZUNGSABRECHNUNG", + "BILANZKREISABRECHNUNG", + "MEHRMINDERMBENGENABRECHNUNG", + "ENDKUNDENABRECHNUNG" + ] + } + }, + "verbrauchsart": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "KL", + "KLW", + "KLWS", + "W", + "WS" + ] + }, + "unterbrechbarkeit": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "UV", + "NUV" + ] + }, + "waermenutzung": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "SPEICHERHEIZUNG", + "WAERMEPUMPE", + "DIREKTHEIZUNG" + ] + }, + "konzessionsabgabe": { + "$ref": "#/definitions/Konzessionsabgabe" + }, + "steuerbefreit": { + "type": [ + "boolean", + "null" + ] + }, + "vorkommastelle": { + "type": [ + "integer", + "null" + ] + }, + "nachkommastelle": { + "type": [ + "integer", + "null" + ] + }, + "guid": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "zaehlwerkId", + "bezeichnung", + "richtung", + "obisKennzahl", + "wandlerfaktor", + "einheit" + ] + } + }, + "type": "object", + "properties": { + "guid": { + "type": [ + "string", + "null" + ] + }, + "boTyp": { + "type": [ + "string", + "null" + ] + }, + "versionStruktur": { + "type": "integer" + }, + "zaehlernummer": { + "type": "string" + }, + "sparte": { + "type": "string", + "enum": [ + "STROM", + "GAS", + "FERNWAERME", + "NAHWAERME", + "WASSER", + "ABWASSER" + ] + }, + "zaehlerauspraegung": { + "type": "string", + "enum": [ + "EINRICHTUNGSZAEHLER", + "ZWEIRICHTUNGSZAEHLER" + ] + }, + "zaehlertyp": { + "type": "string", + "enum": [ + "DREHSTROMZAEHLER", + "BALGENGASZAEHLER", + "DREHKOLBENZAEHLER", + "SMARTMETER", + "LEISTUNGSZAEHLER", + "MAXIMUMZAEHLER", + "TURBINENRADGASZAEHLER", + "ULTRASCHALLGASZAEHLER", + "WECHSELSTROMZAEHLER" + ] + }, + "tarifart": { + "type": "string", + "enum": [ + "EINTARIF", + "ZWEITARIF", + "MEHRTARIF", + "SMART_METER", + "LEISTUNGSGEMESSEN" + ] + }, + "zaehlerkonstante": { + "type": "number" + }, + "eichungBis": { + "type": [ + "string", + "null" + ], + "format": "date-time" + }, + "letzteEichung": { + "type": [ + "string", + "null" + ], + "format": "date-time" + }, + "zaehlwerke": { + "type": "array", + "items": { + "$ref": "#/definitions/Zaehlwerk" + }, + "minItems": 1 + }, + "zaehlerhersteller": { + "$ref": "#/definitions/Geschaeftspartner" + }, + "gateway": { + "type": [ + "string", + "null" + ] + }, + "fernschaltung": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "VORHANDEN", + "NICHT_VORHANDEN" + ] + }, + "messwerterfassung": { + "type": [ + "string", + "null" + ], + "enum": [ + null, + "FERNAUSLESBAR", + "MANUELL_AUSGELESENE" + ] + } + }, + "required": [ + "zaehlernummer", + "sparte", + "zaehlerauspraegung", + "zaehlertyp", + "tarifart", + "zaehlwerke" + ] +} \ No newline at end of file diff --git a/json-schema-files/README.md b/json-schema-files/README.md new file mode 100644 index 00000000..aa049341 --- /dev/null +++ b/json-schema-files/README.md @@ -0,0 +1,2 @@ +## JSchema files for BO4E Business Objects +These files are automatically generated once you run the unit test [`TestJsonSchemaGeneration.TestJSchemaFileGenerationBo`](/BO4ETestProject/TestJsonSchemaGeneration.cs). Ideally they'd be updated automatically after each push (e.g. by using a Github Action) but we don't live in an ideal world yet. diff --git a/protobuf-files/BO4E.BO.Benachrichtigung.proto b/protobuf-files/BO4E.BO.Benachrichtigung.proto deleted file mode 100644 index b42d80b3..00000000 --- a/protobuf-files/BO4E.BO.Benachrichtigung.proto +++ /dev/null @@ -1,48 +0,0 @@ -syntax = "proto2"; -import "protobuf-net/bcl.proto"; // schema for protobuf-net's handling of core .NET types - -message Aufgabe { - optional string aufgabenId = 3; - optional string beschreibung = 4; - optional .bcl.DateTime deadline = 5; - optional bool ausgefuehrt = 6 [default = false]; - optional .bcl.DateTime ausfuehrungszeitpunkt = 7; - optional string ausfuehrender = 8; -} -enum Bearbeitungsstatus { - OFFEN = 0; - IN_BEARBEITUNG = 1; - ABGESCHLOSSEN = 2; - STORNIERT = 3; - QUITTIERT = 4; - IGNORIERT = 5; -} -message Benachrichtigung { - optional string benachrichtigungsId = 4; - optional Prioritaet prioritaet = 5 [default = NORMAL]; - optional Bearbeitungsstatus bearbeitungsstatus = 6 [default = OFFEN]; - optional string kurztext = 7; - optional .bcl.DateTime erstellungsZeitpunkt = 8; - optional string kategorie = 9; - optional string bearbeiter = 10; - repeated Notiz notizen = 11; - optional .bcl.DateTime deadline = 12; - repeated Aufgabe aufgaben = 13; - repeated GenericStringStringInfo infos = 14; -} -message GenericStringStringInfo { - optional string keyColumn = 3; - optional string value = 4; -} -message Notiz { - optional string autor = 3; - optional .bcl.DateTime zeitpunkt = 4; - optional string inhalt = 5; -} -enum Prioritaet { - SEHR_NIEDRIG = 0; - NIEDRIG = 1; - NORMAL = 2; - HOCH = 3; - SEHR_HOCH = 4; -} diff --git a/puml-files/BO/Angebot.puml b/puml-files/BO/Angebot.puml new file mode 100644 index 00000000..09c7a098 --- /dev/null +++ b/puml-files/BO/Angebot.puml @@ -0,0 +1,17 @@ +@startuml +class Angebot { + + Angebotsnummer : string <> <> + + Anfragereferenz : string <> <> + + Angebotsdatum : string <> <> +} +class "List`1" { +} +BusinessObject <|-- Angebot +Angebot --> "Sparte" Sparte +Angebot --> "Bindefrist" DateTime +Angebot --> "Angebotgeber" Geschaeftspartner +Angebot --> "Angebotnehmer" Geschaeftspartner +Angebot --> "UnterzeichnerAngebotsnehmer" Ansprechpartner +Angebot --> "UnterzeichnerAngebotsgeber" Ansprechpartner +Angebot --> "Varianten" "List`1" +@enduml diff --git a/puml-files/BO/Ansprechpartner.puml b/puml-files/BO/Ansprechpartner.puml new file mode 100644 index 00000000..5b973bc4 --- /dev/null +++ b/puml-files/BO/Ansprechpartner.puml @@ -0,0 +1,18 @@ +@startuml +class Ansprechpartner { + + Anrede : Anrede? <> <> + + IndividuelleAnrede : string <> <> + + Titel : Titel? + + Vorname : string <> <> + + Nachname : string <> <> + + EMailAdresse : string <> <> + + Kommentar : string <> <> +} +class "List`1" { +} +BusinessObject <|-- Ansprechpartner +Ansprechpartner --> "Geschaeftspartner" Geschaeftspartner +Ansprechpartner --> "Adresse" Adresse +Ansprechpartner --> "Rufnummer" "List`1" +Ansprechpartner --> "Zustaendigkeit" "List`1" +@enduml diff --git a/puml-files/BO/Benachrichtigung.puml b/puml-files/BO/Benachrichtigung.puml new file mode 100644 index 00000000..e30779cf --- /dev/null +++ b/puml-files/BO/Benachrichtigung.puml @@ -0,0 +1,18 @@ +@startuml +class Benachrichtigung { + + BenachrichtigungsId : string <> <> + + Kurztext : string <> <> + + Kategorie : string <> <> + + Bearbeiter : string <> <> + + Deadline : DateTime? <> <> +} +class "List`1" { +} +BusinessObject <|-- Benachrichtigung +Benachrichtigung --> "Prioritaet" Prioritaet +Benachrichtigung --> "Bearbeitungsstatus" Bearbeitungsstatus +Benachrichtigung --> "ErstellungsZeitpunkt" DateTime +Benachrichtigung --> "Notizen" "List`1" +Benachrichtigung --> "Aufgaben" "List`1" +Benachrichtigung --> "Infos" "List`1" +@enduml diff --git a/puml-files/BO/BusinessObject.puml b/puml-files/BO/BusinessObject.puml new file mode 100644 index 00000000..bd38ad80 --- /dev/null +++ b/puml-files/BO/BusinessObject.puml @@ -0,0 +1,40 @@ +@startuml +abstract class BusinessObject { + + BoTyp : string <> <> + + <> USER_PROPERTIES_NAME : string = "userProperties" + + GetBoTyp() : string + + versionStruktur : int + + guid : string + + GetJsonScheme() : JSchema + + {static} GetJsonSchema(boType:Type) : JSchema + + GetURI(includeUserProperties:bool) : Bo4eUri + + GetBoKeyNames() : List + + {static} GetBoKeyNames(boType:Type) : List + + {static} GetExpandablePropertyNames(boType:Type) : Dictionary + + {static} GetExpandableFieldNames(boTypeName:string) : Dictionary + + GetBoKeys() : Dictionary + + {static} GetBoKeyProps(boType:Type) : List + + <> Equals(b:object) : bool + + Equals(b:BusinessObject) : bool + + <> GetHashCode() : int + + <> IsValid() : bool +} +class "IEquatable`1" { +} +class "IDictionary`2" { +} +class BaseSpecifiedConcreteClassConverter { +} +class BusinessObjectBaseConverter { + + <> CanConvert(objectType:Type) : bool + + <> ReadJson(reader:JsonReader, objectType:Type, existingValue:object, serializer:JsonSerializer) : object + + <> CanWrite : bool <> + + <> WriteJson(writer:JsonWriter, value:object, serializer:JsonSerializer) : void +} +"IEquatable`1" "" <|-- BusinessObject +BusinessObject --> "UserProperties" "IDictionary`2" +BusinessObject +-- BaseSpecifiedConcreteClassConverter +DefaultContractResolver <|-- BaseSpecifiedConcreteClassConverter +BusinessObject +-- BusinessObjectBaseConverter +JsonConverter <|-- BusinessObjectBaseConverter +@enduml diff --git a/puml-files/BO/Energiemenge.puml b/puml-files/BO/Energiemenge.puml new file mode 100644 index 00000000..6819f7ed --- /dev/null +++ b/puml-files/BO/Energiemenge.puml @@ -0,0 +1,12 @@ +@startuml +class Energiemenge { + + LokationsId : string <> <> +} +class "List`1" { +} +class "Dictionary`2" { +} +BusinessObject <|-- Energiemenge +Energiemenge --> "LokationsTyp" Lokationstyp +Energiemenge --> "Energieverbrauch" "List`1" +@enduml diff --git a/puml-files/BO/Geschaeftspartner.puml b/puml-files/BO/Geschaeftspartner.puml new file mode 100644 index 00000000..c3df1e37 --- /dev/null +++ b/puml-files/BO/Geschaeftspartner.puml @@ -0,0 +1,22 @@ +@startuml +class Geschaeftspartner { + + anrede : Anrede? <> <> + + Title : string <> <> + + Name1 : string <> <> + + Name2 : string <> <> + + Name3 : string <> <> + + Gewerbekennzeichnung : bool <> <> + + Hrnummer : string <> <> + + Amtsgericht : string <> <> + + UmsatzsteuerId : string <> <> + + GlaeubigerId : string <> <> + + EMailAdresse : string <> <> + + Website : string <> <> +} +class "List`1" { +} +BusinessObject <|-- Geschaeftspartner +Geschaeftspartner --> "Kontaktweg" "List`1" +Geschaeftspartner --> "Geschaeftspartnerrolle" "List`1" +Geschaeftspartner --> "Partneradresse" Adresse +@enduml diff --git a/puml-files/BO/Kosten.puml b/puml-files/BO/Kosten.puml new file mode 100644 index 00000000..999e5cda --- /dev/null +++ b/puml-files/BO/Kosten.puml @@ -0,0 +1,12 @@ +@startuml +class Kosten { +} +class "List`1" { +} +BusinessObject <|-- Kosten +Kosten --> "Kostenklasse" Kostenklasse +Kosten --> "Gueltigkeit" Zeitraum +Kosten --> "SummeKosten" "List`1" +Kosten --> "Kostenbloecke" "List`1" +Kosten --> "Kostenpositionen" "List`1" +@enduml diff --git a/puml-files/BO/LogObject/LogObject.puml b/puml-files/BO/LogObject/LogObject.puml new file mode 100644 index 00000000..c0008c96 --- /dev/null +++ b/puml-files/BO/LogObject/LogObject.puml @@ -0,0 +1,8 @@ +@startuml +class LogObject { + + Id : string <> <> + + LogMessage : string <> <> +} +BusinessObject <|-- LogObject +LogObject --> "Datetime" DateTime +@enduml diff --git a/puml-files/BO/Marktlokation.puml b/puml-files/BO/Marktlokation.puml new file mode 100644 index 00000000..ea420abd --- /dev/null +++ b/puml-files/BO/Marktlokation.puml @@ -0,0 +1,36 @@ +@startuml +class Marktlokation { + + MarktlokationsId : string <> <> + + Verbrauchsart : Verbrauchsart? <> <> + + Unterbrechbar : bool? <> <> + + NetzbetreiberCodeNr : string <> <> + + GebietType : Gebiettyp? <> <> + + NetzgebietNr : string <> <> + + Bilanzierungsgebiet : string <> <> + + GrundversorgerCodeNr : string <> <> + + Gasqualitaet : Gasqualitaet? <> <> + + Regelzone : string <> <> + + Marktgebiet : string <> <> + + Zeitreihentyp : Zeitreihentyp? <> <> + + {static} ValidateId(id:string) : bool + + {static} GetChecksum(input:string) : string + + HasValidId() : bool + + IsValid(checkId:bool) : bool +} +class "List`1" { +} +BusinessObject <|-- Marktlokation +Marktlokation --> "Sparte" Sparte +Marktlokation --> "Energierichtung" Energierichtung +Marktlokation --> "Bilanzierungsmethode" Bilanzierungsmethode +Marktlokation --> "Netzebene" Netzebene +Marktlokation --> "Endkunde" Geschaeftspartner +Marktlokation --> "Lokationsadresse" Adresse +Marktlokation --> "Geoadresse" Geokoordinaten +Marktlokation --> "Katasterinformation" Katasteradresse +Marktlokation --> "Marktrollen" "List`1" +Marktlokation --> "Zaehlwerke" "List`1" +Marktlokation --> "Verbrauchsmenge" "List`1" +Marktlokation --> "Messlokationen" "List`1" +Marktlokation --> "ZugehoerigeMesslokationen" "List`1" +@enduml diff --git a/puml-files/BO/Marktteilnehmer.puml b/puml-files/BO/Marktteilnehmer.puml new file mode 100644 index 00000000..c5a433c2 --- /dev/null +++ b/puml-files/BO/Marktteilnehmer.puml @@ -0,0 +1,10 @@ +@startuml +class Marktteilnehmer { + + Rollencodenummer : string <> <> + + Makoadresse : string <> <> +} +Geschaeftspartner <|-- Marktteilnehmer +Marktteilnehmer --> "Marktrolle" Marktrolle +Marktteilnehmer --> "Rollencodetyp" Rollencodetyp +Marktteilnehmer --> "Ansprechpartner" Ansprechpartner +@enduml diff --git a/puml-files/BO/Messlokation.puml b/puml-files/BO/Messlokation.puml new file mode 100644 index 00000000..45cabc8c --- /dev/null +++ b/puml-files/BO/Messlokation.puml @@ -0,0 +1,28 @@ +@startuml +class Messlokation { + + MesslokationsId : string <> <> + + NetzebeneMessung : Netzebene? <> <> + + MessgebietNr : string <> <> + + GrundzustaendigerMSBCodeNr : string <> <> + + GrundzustaendigerMSBIMCodeNr : string <> <> + + GrundzustaendigerMDLCodeNr : string <> <> + + Bilanzierungsmethode : Bilanzierungsmethode? <> <> + + Abrechnungmessstellenbetriebnna : bool? <> <> + + Gasqualitaet : Gasqualitaet? <> <> + + Verlustfaktor : decimal? <> <> + + {static} ValidateId(id:string) : bool + + HasValidId() : bool + + IsValid(checkId:bool) : bool +} +class "List`1" { +} +BusinessObject <|-- Messlokation +Messlokation --> "Sparte" Sparte +Messlokation --> "Messadresse" Adresse +Messlokation --> "Geoadresse" Geokoordinaten +Messlokation --> "Katasterinformation" Katasteradresse +Messlokation --> "Geraete" "List`1" +Messlokation --> "Messdienstleistung" "List`1" +Messlokation --> "Messlokationszaehler" "List`1" +Messlokation --> "Marktrollen" "List`1" +@enduml diff --git a/puml-files/BO/Preisblatt.puml b/puml-files/BO/Preisblatt.puml new file mode 100644 index 00000000..bc965c03 --- /dev/null +++ b/puml-files/BO/Preisblatt.puml @@ -0,0 +1,10 @@ +@startuml +class Preisblatt { + + Bezeichnung : string <> <> +} +class "List`1" { +} +BusinessObject <|-- Preisblatt +Preisblatt --> "Gueltigkeit" Zeitraum +Preisblatt --> "Preispositionen" "List`1" +@enduml diff --git a/puml-files/BO/PreisblattDienstleistung.puml b/puml-files/BO/PreisblattDienstleistung.puml new file mode 100644 index 00000000..04e270e3 --- /dev/null +++ b/puml-files/BO/PreisblattDienstleistung.puml @@ -0,0 +1,8 @@ +@startuml +class PreisblattDienstleistung { + + Geraetedetails : Bilanzierungsmethode? <> <> +} +Preisblatt <|-- PreisblattDienstleistung +PreisblattDienstleistung --> "Dienstleistungsdetails" Dienstleistungstyp +PreisblattDienstleistung --> "Herausgeber" Marktteilnehmer +@enduml diff --git a/puml-files/BO/PreisblattKonzessionsabgabe.puml b/puml-files/BO/PreisblattKonzessionsabgabe.puml new file mode 100644 index 00000000..4491ef23 --- /dev/null +++ b/puml-files/BO/PreisblattKonzessionsabgabe.puml @@ -0,0 +1,7 @@ +@startuml +class PreisblattKonzessionsabgabe { +} +Preisblatt <|-- PreisblattKonzessionsabgabe +PreisblattKonzessionsabgabe --> "sparte" Sparte +PreisblattKonzessionsabgabe --> "KundengruppeKA" KundengruppeKA +@enduml diff --git a/puml-files/BO/PreisblattMessung.puml b/puml-files/BO/PreisblattMessung.puml new file mode 100644 index 00000000..d1cd4d22 --- /dev/null +++ b/puml-files/BO/PreisblattMessung.puml @@ -0,0 +1,14 @@ +@startuml +class PreisblattMessung { +} +class "List`1" { +} +Preisblatt <|-- PreisblattMessung +PreisblattMessung --> "Sparte" Sparte +PreisblattMessung --> "Bilanzierungsmethode" Bilanzierungsmethode +PreisblattMessung --> "Messebene" Netzebene +PreisblattMessung --> "InklusiveDienstleistung" "List`1" +PreisblattMessung --> "Basisgeraet" Geraeteeigenschaften +PreisblattMessung --> "InklusiveGeraete" "List`1" +PreisblattMessung --> "Herausgeber" Marktteilnehmer +@enduml diff --git a/puml-files/BO/PreisblattNetznutzung.puml b/puml-files/BO/PreisblattNetznutzung.puml new file mode 100644 index 00000000..5623b9e6 --- /dev/null +++ b/puml-files/BO/PreisblattNetznutzung.puml @@ -0,0 +1,10 @@ +@startuml +class PreisblattNetznutzung { +} +Preisblatt <|-- PreisblattNetznutzung +PreisblattNetznutzung --> "Sparte" Sparte +PreisblattNetznutzung --> "Bilanzierungsmethode" Bilanzierungsmethode +PreisblattNetznutzung --> "Netzebene" Netzebene +PreisblattNetznutzung --> "Kundengruppe" Kundengruppe +PreisblattNetznutzung --> "Herausgeber" Marktteilnehmer +@enduml diff --git a/puml-files/BO/PreisblattUmlagen.puml b/puml-files/BO/PreisblattUmlagen.puml new file mode 100644 index 00000000..6d2b4e78 --- /dev/null +++ b/puml-files/BO/PreisblattUmlagen.puml @@ -0,0 +1,6 @@ +@startuml +class PreisblattUmlagen { +} +Preisblatt <|-- PreisblattUmlagen +PreisblattUmlagen --> "Sparte" Sparte +@enduml diff --git a/puml-files/BO/Rechnung.puml b/puml-files/BO/Rechnung.puml new file mode 100644 index 00000000..9c5ca930 --- /dev/null +++ b/puml-files/BO/Rechnung.puml @@ -0,0 +1,28 @@ +@startuml +class Rechnung { + + Rechnungstitel : string <> <> + + Rechnungsstatus : Rechnungsstatus? <> <> + + Storno : bool <> <> + + Rechnungsnummer : string <> <> + + OriginalRechnungsnummer : string <> <> + + Rechnung() + + Rechnung(sapPrintDocument:JObject) +} +class "List`1" { +} +BusinessObject <|-- Rechnung +Rechnung --> "Rechnungsdatum" DateTime +Rechnung --> "Faelligkeitsdatum" DateTime +Rechnung --> "Rechnungsstyp" Rechnungstyp +Rechnung --> "Rechnungsperiode" Zeitraum +Rechnung --> "Rechnungsersteller" Geschaeftspartner +Rechnung --> "Rechnungsempfaenger" Geschaeftspartner +Rechnung --> "Gesamtnetto" Betrag +Rechnung --> "Gesamtsteuer" Betrag +Rechnung --> "Gesamtbrutto" Betrag +Rechnung --> "Vorausgezahlt" Betrag +Rechnung --> "rabattBrutto" Betrag +Rechnung --> "Zuzahlen" Betrag +Rechnung --> "Steuerbetraege" "List`1" +Rechnung --> "Rechnungspositionen" "List`1" +@enduml diff --git a/puml-files/BO/Region.puml b/puml-files/BO/Region.puml new file mode 100644 index 00000000..8f130082 --- /dev/null +++ b/puml-files/BO/Region.puml @@ -0,0 +1,10 @@ +@startuml +class Region { + + Bezeichnung : string <> <> +} +class "List`1" { +} +BusinessObject <|-- Region +Region --> "PositivListe" "List`1" +Region --> "NegativListe" "List`1" +@enduml diff --git a/puml-files/BO/Vertrag.puml b/puml-files/BO/Vertrag.puml new file mode 100644 index 00000000..199d2709 --- /dev/null +++ b/puml-files/BO/Vertrag.puml @@ -0,0 +1,23 @@ +@startuml +class Vertrag { + + Vertragsnummer : string <> <> + + Beschreibung : string <> <> + + Gemeinderabatt : decimal? <> <> + + Vertrag() +} +class "List`1" { +} +BusinessObject <|-- Vertrag +Vertrag --> "Vertragsart" Vertragsart +Vertrag --> "Vertragstatus" Vertragstatus +Vertrag --> "Sparte" Sparte +Vertrag --> "Vertragsbeginn" DateTime +Vertrag --> "Vertragsende" DateTime +Vertrag --> "Vertragspartner1" Geschaeftspartner +Vertrag --> "Vertragspartner2" Geschaeftspartner +Vertrag --> "Unterzeichnervp1" "List`1" +Vertrag --> "Unterzeichnervp2" "List`1" +Vertrag --> "Vertragskonditionen" Vertragskonditionen +Vertrag --> "Vertragsteile" "List`1" +Vertrag --> "Korrespondenzpartner" Geschaeftspartner +@enduml diff --git a/puml-files/BO/Zaehler.puml b/puml-files/BO/Zaehler.puml new file mode 100644 index 00000000..4a415c86 --- /dev/null +++ b/puml-files/BO/Zaehler.puml @@ -0,0 +1,20 @@ +@startuml +class Zaehler { + + Zaehlernummer : string <> <> + + EichungBis : DateTime? <> <> + + LetzteEichung : DateTime? <> <> + + Gateway : string <> <> + + Fernschaltung : Fernschaltung? <> <> + + Messwerterfassung : Messwerterfassung? <> <> +} +class "List`1" { +} +BusinessObject <|-- Zaehler +Zaehler --> "Sparte" Sparte +Zaehler --> "Zaehlerauspraegung" Zaehlerauspraegung +Zaehler --> "Zaehlertyp" Zaehlertyp +Zaehler --> "Tarifart" Tarifart +Zaehler --> "zaehlerkonstante" Decimal +Zaehler --> "Zaehlwerke" "List`1" +Zaehler --> "Zaehlerhersteller" Geschaeftspartner +@enduml diff --git a/puml-files/BoEdiMapper.puml b/puml-files/BoEdiMapper.puml new file mode 100644 index 00000000..d623aca5 --- /dev/null +++ b/puml-files/BoEdiMapper.puml @@ -0,0 +1,7 @@ +@startuml +class BoEdiMapper { + + {static} ToEdi(objectName:string, objectValue:string) : string + + {static} ReplaceWithEdiValues(o:Object) : JObject +} +BoEdiMapper o-> "_logger" ILogger +@enduml diff --git a/puml-files/BoMapper.puml b/puml-files/BoMapper.puml new file mode 100644 index 00000000..64c4d897 --- /dev/null +++ b/puml-files/BoMapper.puml @@ -0,0 +1,21 @@ +@startuml +abstract class BoMapper { + + {static} <> packagePrefix : string = "BO4E.BO" + + {static} MapObject(jobject:JObject, lenient:LenientParsing) : BusinessObject + + {static} MapObject(jobject:JObject, userPropertiesWhiteList:HashSet, lenient:LenientParsing) : BusinessObject + + {static} MapObject(businessObjectName:string, jobject:JObject, lenient:LenientParsing) : BusinessObject + + {static} MapObject(businessObjectType:Type, jobject:JObject, lenient:LenientParsing) : BusinessObject + + {static} MapObject(jobject:JObject, lenient:LenientParsing) : BusinessObjectType + + {static} MapObject(businessObjectName:string, jobject:JObject, userPropertiesWhiteList:HashSet, lenient:LenientParsing) : BusinessObject + + {static} MapObject(businessObjectType:Type, jobject:JObject, userPropertiesWhiteList:HashSet, lenient:LenientParsing) : BusinessObject + + {static} MapObject(jobject:JObject, userPropertiesWhiteList:HashSet, lenient:LenientParsing) : BusinessObjectType + + {static} GetValidBoNames() : HashSet + + {static} GetTypeForBoName(businessObjectName:string) : Type + + {static} GetJsonSchemeFor(businessObjectName:string) : JSchema + + {static} GetJsonSchemeFor(businessObjectType:Type) : JSchema + + {static} GetAnnotatedFields(boName:string) : FieldInfo[] + + {static} GetAnnotatedFields(type:Type) : FieldInfo[] + + {static} GetAnnotatedFields(boType:Type, attributeType:Type) : FieldInfo[] + + {static} GetAnnotatedFields(boName:string, attributeType:Type) : FieldInfo[] +} +@enduml diff --git a/puml-files/COM/Adresse.puml b/puml-files/COM/Adresse.puml new file mode 100644 index 00000000..cc492b2d --- /dev/null +++ b/puml-files/COM/Adresse.puml @@ -0,0 +1,13 @@ +@startuml +class Adresse { + + Postleitzahl : string <> <> + + Ort : string <> <> + + Strasse : string <> <> + + Hausnummer : string <> <> + + Postfach : string <> <> + + Adresszusatz : string <> <> + + CoErgaenzung : string <> <> + + Landescode : Landescode? <> <> +} +COM <|-- Adresse +@enduml diff --git a/puml-files/COM/Angebotsposition.puml b/puml-files/COM/Angebotsposition.puml new file mode 100644 index 00000000..ba3f84e1 --- /dev/null +++ b/puml-files/COM/Angebotsposition.puml @@ -0,0 +1,9 @@ +@startuml +class Angebotsposition { + + Positionsbezeichung : string <> <> +} +COM <|-- Angebotsposition +Angebotsposition --> "Positionsmenge" Menge +Angebotsposition --> "Positionspreis" Preis +Angebotsposition --> "Positionsbetrag" Betrag +@enduml diff --git a/puml-files/COM/Angebotsteil.puml b/puml-files/COM/Angebotsteil.puml new file mode 100644 index 00000000..affb8c6f --- /dev/null +++ b/puml-files/COM/Angebotsteil.puml @@ -0,0 +1,12 @@ +@startuml +class Angebotsteil { + + AnfrageSubreferenz : string <> <> +} +class "List`1" { +} +COM <|-- Angebotsteil +Angebotsteil --> "Lieferstellenangebotsteil" "List`1" +Angebotsteil --> "Gesamtmengeangebotsteil" Menge +Angebotsteil --> "Gesamtkostenangebotsteil" Betrag +Angebotsteil --> "Positionen" "List`1" +@enduml diff --git a/puml-files/COM/Angebotsvariante.puml b/puml-files/COM/Angebotsvariante.puml new file mode 100644 index 00000000..bb7b99d9 --- /dev/null +++ b/puml-files/COM/Angebotsvariante.puml @@ -0,0 +1,14 @@ +@startuml +class Angebotsvariante { + + Beschreibung : string <> <> +} +class "List`1" { +} +COM <|-- Angebotsvariante +Angebotsvariante --> "Angebotsstatus" Angebotsstatus +Angebotsvariante --> "Erstelldatum" DateTime +Angebotsvariante --> "Bindefrist" DateTime +Angebotsvariante --> "Gesamtmenge" Menge +Angebotsvariante --> "Gesamtkosten" Betrag +Angebotsvariante --> "Teile" "List`1" +@enduml diff --git a/puml-files/COM/AufAbschlag.puml b/puml-files/COM/AufAbschlag.puml new file mode 100644 index 00000000..6ec9df3b --- /dev/null +++ b/puml-files/COM/AufAbschlag.puml @@ -0,0 +1,15 @@ +@startuml +class AufAbschlag { + + Bezeichnung : string <> <> + + Beschreibung : string <> <> + + AufAbschlagstyp : AufAbschlagstyp? <> <> + + aufAbschlagsziel : AufAbschlagsziel? <> <> + + Einheit : Waehrungseinheit? <> <> + + Website : string <> <> +} +class "List`1" { +} +COM <|-- AufAbschlag +AufAbschlag --> "Gueltigkeitszeitraum" Zeitraum +AufAbschlag --> "Staffeln" "List`1" +@enduml diff --git a/puml-files/COM/Aufgabe.puml b/puml-files/COM/Aufgabe.puml new file mode 100644 index 00000000..26ef4c4a --- /dev/null +++ b/puml-files/COM/Aufgabe.puml @@ -0,0 +1,11 @@ +@startuml +class Aufgabe { + + AufgabenId : string <> <> + + Beschreibung : string <> <> + + Deadline : DateTime? <> <> + + Ausgefuehrt : bool <> <> + + Ausfuehrungszeitpunkt : DateTime? <> <> + + Ausfuehrender : string <> <> +} +COM <|-- Aufgabe +@enduml diff --git a/puml-files/COM/Ausschreibungsdetail.puml b/puml-files/COM/Ausschreibungsdetail.puml new file mode 100644 index 00000000..d88d1229 --- /dev/null +++ b/puml-files/COM/Ausschreibungsdetail.puml @@ -0,0 +1,20 @@ +@startuml +class Ausschreibungsdetail { + + LokationsId : string <> <> + + Lokationsbezeichung : string <> <> + + Netzbetreiber : string <> <> + + Kunde : string <> <> + + Zaehlernummer : string <> <> + + Zaehlertechnik : Zaehlertyp? <> <> + + LastgangVorhanden : bool? <> <> +} +COM <|-- Ausschreibungsdetail +Ausschreibungsdetail --> "NetzebeneLieferung" Netzebene +Ausschreibungsdetail --> "NetzebeneMessung" Netzebene +Ausschreibungsdetail --> "Lokationsadresse" Adresse +Ausschreibungsdetail --> "Rechnungsadresse" Adresse +Ausschreibungsdetail --> "PrognoseJahresarbeit" Menge +Ausschreibungsdetail --> "PrognoseArbeitLieferzeitraum" Menge +Ausschreibungsdetail --> "PrognoseLeistung" Menge +Ausschreibungsdetail --> "Lieferzeitraum" Zeitraum +@enduml diff --git a/puml-files/COM/Ausschreibungslos.puml b/puml-files/COM/Ausschreibungslos.puml new file mode 100644 index 00000000..ceecd667 --- /dev/null +++ b/puml-files/COM/Ausschreibungslos.puml @@ -0,0 +1,24 @@ +@startuml +class Ausschreibungslos { + + Losnummer : string <> <> + + Bezeichung : string <> <> + + Bemerkung : string <> <> + + BetreutDurch : string <> <> + + AnzahlLieferstellen : int <> <> +} +class "List`1" { +} +COM <|-- Ausschreibungslos +Ausschreibungslos --> "Preismodell" Preismodell +Ausschreibungslos --> "Energieart" Sparte +Ausschreibungslos --> "WunschRechnungslegung" Rechnungslegung +Ausschreibungslos --> "WunschVertragsform" Vertragsform +Ausschreibungslos --> "Lieferstellen" "List`1" +Ausschreibungslos --> "Gesamtmenge" Menge +Ausschreibungslos --> "WunschMindestmenge" Menge +Ausschreibungslos --> "WunschMaximalmenge" Menge +Ausschreibungslos --> "Wiederholungsintervall" Zeitraum +Ausschreibungslos --> "lieferzeitraum" Zeitraum +Ausschreibungslos --> "WunschKuendingungsfrist" Zeitraum +Ausschreibungslos --> "WunschZahlungsziel" Zeitraum +@enduml diff --git a/puml-files/COM/Betrag.puml b/puml-files/COM/Betrag.puml new file mode 100644 index 00000000..dd1cf1bf --- /dev/null +++ b/puml-files/COM/Betrag.puml @@ -0,0 +1,7 @@ +@startuml +class Betrag { + + Wert : decimal <> <> +} +COM <|-- Betrag +Betrag --> "Waehrung" Waehrungscode +@enduml diff --git a/puml-files/COM/COM.puml b/puml-files/COM/COM.puml new file mode 100644 index 00000000..f303d240 --- /dev/null +++ b/puml-files/COM/COM.puml @@ -0,0 +1,15 @@ +@startuml +abstract class COM { + + <> Equals(b:object) : bool + + Equals(b:COM) : bool + + <> GetHashCode() : int + + IsValid() : bool + + Guid : string <> <> +} +class "IEquatable`1" { +} +class "IDictionary`2" { +} +"IEquatable`1" "" <|-- COM +COM --> "UserProperties" "IDictionary`2" +@enduml diff --git a/puml-files/COM/Dienstleistung.puml b/puml-files/COM/Dienstleistung.puml new file mode 100644 index 00000000..3cb53268 --- /dev/null +++ b/puml-files/COM/Dienstleistung.puml @@ -0,0 +1,7 @@ +@startuml +class Dienstleistung { + + Bezeichnung : string <> <> +} +COM <|-- Dienstleistung +Dienstleistung --> "Dienstleistungstyp" Dienstleistungstyp +@enduml diff --git a/puml-files/COM/Energieherkunft.puml b/puml-files/COM/Energieherkunft.puml new file mode 100644 index 00000000..35f4dd2b --- /dev/null +++ b/puml-files/COM/Energieherkunft.puml @@ -0,0 +1,7 @@ +@startuml +class Energieherkunft { + + AnteilProzent : decimal <> <> +} +COM <|-- Energieherkunft +Energieherkunft --> "Erzeugungsart" Erzeugungsart +@enduml diff --git a/puml-files/COM/Energiemix.puml b/puml-files/COM/Energiemix.puml new file mode 100644 index 00000000..bd623803 --- /dev/null +++ b/puml-files/COM/Energiemix.puml @@ -0,0 +1,19 @@ +@startuml +class Energiemix { + + Energiemixnummer : int <> <> + + Bezeichnung : string <> <> + + Bemerkung : string <> <> + + Gueltigkeitsjahr : int <> <> + + CO2Emission : decimal? <> <> + + Atommuell : decimal? <> <> + + OekoTopTen : bool? <> <> + + Website : string <> <> +} +class "List`1" { +} +COM <|-- Energiemix +Energiemix --> "Energieart" Sparte +Energiemix --> "oekozertifikat" "List`1" +Energiemix --> "Oekolabel" "List`1" +Energiemix --> "Anteil" "List`1" +@enduml diff --git a/puml-files/COM/GenericStringStringInfo.puml b/puml-files/COM/GenericStringStringInfo.puml new file mode 100644 index 00000000..21c0288e --- /dev/null +++ b/puml-files/COM/GenericStringStringInfo.puml @@ -0,0 +1,8 @@ +@startuml +class GenericStringStringInfo { + + KeyColumn : string <> <> + + Value : string <> <> + + ToKeyValuePair() : KeyValuePair +} +COM <|-- GenericStringStringInfo +@enduml diff --git a/puml-files/COM/Geokoordinaten.puml b/puml-files/COM/Geokoordinaten.puml new file mode 100644 index 00000000..3ec1eab0 --- /dev/null +++ b/puml-files/COM/Geokoordinaten.puml @@ -0,0 +1,7 @@ +@startuml +class Geokoordinaten { + + Breitengrad : decimal <> <> + + Laengengrad : decimal <> <> +} +COM <|-- Geokoordinaten +@enduml diff --git a/puml-files/COM/Geraet.puml b/puml-files/COM/Geraet.puml new file mode 100644 index 00000000..35a7a4b3 --- /dev/null +++ b/puml-files/COM/Geraet.puml @@ -0,0 +1,7 @@ +@startuml +class Geraet { + + Geraetenummer : string <> <> +} +COM <|-- Geraet +Geraet --> "Geraeteeigenschaften" Geraeteeigenschaften +@enduml diff --git a/puml-files/COM/Geraeteeigenschaften.puml b/puml-files/COM/Geraeteeigenschaften.puml new file mode 100644 index 00000000..45d28191 --- /dev/null +++ b/puml-files/COM/Geraeteeigenschaften.puml @@ -0,0 +1,7 @@ +@startuml +class Geraeteeigenschaften { + + Geraetemerkmal : Geraetemerkmal? <> <> +} +COM <|-- Geraeteeigenschaften +Geraeteeigenschaften --> "Geraetetyp" Geraetetyp +@enduml diff --git a/puml-files/COM/Hardware.puml b/puml-files/COM/Hardware.puml new file mode 100644 index 00000000..bc64c8b8 --- /dev/null +++ b/puml-files/COM/Hardware.puml @@ -0,0 +1,10 @@ +@startuml +class Hardware { + + Bezeichnung : string <> <> + + Geraetenummer : string <> <> + + Geraetereferenz : string <> <> +} +COM <|-- Hardware +Hardware --> "Geraetetyp" Geraetetyp +Hardware --> "Geraeteeigenschaften" Geraeteeigenschaften +@enduml diff --git a/puml-files/COM/Katasteradresse.puml b/puml-files/COM/Katasteradresse.puml new file mode 100644 index 00000000..76a815df --- /dev/null +++ b/puml-files/COM/Katasteradresse.puml @@ -0,0 +1,7 @@ +@startuml +class Katasteradresse { + + Gemarkung_flur : string <> <> + + Flurstueck : string <> <> +} +COM <|-- Katasteradresse +@enduml diff --git a/puml-files/COM/Konzessionsabgabe.puml b/puml-files/COM/Konzessionsabgabe.puml new file mode 100644 index 00000000..3e60a2f5 --- /dev/null +++ b/puml-files/COM/Konzessionsabgabe.puml @@ -0,0 +1,8 @@ +@startuml +class Konzessionsabgabe { + + Kosten : decimal <> <> + + Kategorie : string <> <> +} +COM <|-- Konzessionsabgabe +Konzessionsabgabe --> "Satz" AbgabeArt +@enduml diff --git a/puml-files/COM/Kostenblock.puml b/puml-files/COM/Kostenblock.puml new file mode 100644 index 00000000..c196bc23 --- /dev/null +++ b/puml-files/COM/Kostenblock.puml @@ -0,0 +1,10 @@ +@startuml +class Kostenblock { + + Kostenblockbezeichnung : string <> <> +} +class "List`1" { +} +COM <|-- Kostenblock +Kostenblock --> "SummeKostenblock" Betrag +Kostenblock --> "Kostenpositionen" "List`1" +@enduml diff --git a/puml-files/COM/Kostenposition.puml b/puml-files/COM/Kostenposition.puml new file mode 100644 index 00000000..8db45ba0 --- /dev/null +++ b/puml-files/COM/Kostenposition.puml @@ -0,0 +1,14 @@ +@startuml +class Kostenposition { + + Positionstitel : string <> <> + + Von : DateTime? <> <> + + Bis : DateTime? <> <> + + Artikelbezeichnung : string <> <> + + Artikeldetail : string <> <> +} +COM <|-- Kostenposition +Kostenposition --> "Menge" Menge +Kostenposition --> "Zeitmenge" Menge +Kostenposition --> "Einzelpreis" Preis +Kostenposition --> "BetragKostenposition" Betrag +@enduml diff --git a/puml-files/COM/Kriteriumswert.puml b/puml-files/COM/Kriteriumswert.puml new file mode 100644 index 00000000..513306cf --- /dev/null +++ b/puml-files/COM/Kriteriumswert.puml @@ -0,0 +1,7 @@ +@startuml +class KriteriumsWert { + + Wert : string <> <> +} +COM <|-- KriteriumsWert +KriteriumsWert --> "Kriterium" Tarifregionskriterium +@enduml diff --git a/puml-files/COM/Marktrolle.puml b/puml-files/COM/Marktrolle.puml new file mode 100644 index 00000000..e94ed81d --- /dev/null +++ b/puml-files/COM/Marktrolle.puml @@ -0,0 +1,7 @@ +@startuml +class Marktrolle { + + Rollencodenummer : string <> <> + + Code : string <> <> +} +COM <|-- Marktrolle +@enduml diff --git a/puml-files/COM/Menge.puml b/puml-files/COM/Menge.puml new file mode 100644 index 00000000..8a86a142 --- /dev/null +++ b/puml-files/COM/Menge.puml @@ -0,0 +1,7 @@ +@startuml +class Menge { + + Wert : decimal <> <> +} +COM <|-- Menge +Menge --> "Einheit" Mengeneinheit +@enduml diff --git a/puml-files/COM/Messlokationszuordnung.puml b/puml-files/COM/Messlokationszuordnung.puml new file mode 100644 index 00000000..bfdeba2d --- /dev/null +++ b/puml-files/COM/Messlokationszuordnung.puml @@ -0,0 +1,9 @@ +@startuml +class Messlokationszuordnung { + + MesslokationsId : string <> <> + + Arithmetik : ArithmetischeOperation? <> <> + + GueltigSeit : DateTime? <> <> + + GueltigBis : DateTime? <> <> +} +COM <|-- Messlokationszuordnung +@enduml diff --git a/puml-files/COM/Notiz.puml b/puml-files/COM/Notiz.puml new file mode 100644 index 00000000..6f6b4a60 --- /dev/null +++ b/puml-files/COM/Notiz.puml @@ -0,0 +1,9 @@ +@startuml +class Notiz { + + Autor : string <> <> + + Inhalt : string <> <> + + CleanUpSapNotes(context:StreamingContext) : void +} +COM <|-- Notiz +Notiz --> "Zeitpunkt" DateTime +@enduml diff --git a/puml-files/COM/PhysikalischerWert.puml b/puml-files/COM/PhysikalischerWert.puml new file mode 100644 index 00000000..c38f975d --- /dev/null +++ b/puml-files/COM/PhysikalischerWert.puml @@ -0,0 +1,9 @@ +@startuml +class PhysikalischerWert { + + Wert : decimal <> <> + + PhysikalischerWert(wert:decimal, einheit:Mengeneinheit) + + PhysikalischerWert(wert:decimal, einheitString:string) +} +COM <|-- PhysikalischerWert +PhysikalischerWert --> "Einheit" Mengeneinheit +@enduml diff --git a/puml-files/COM/PositionsAufAbschlag.puml b/puml-files/COM/PositionsAufAbschlag.puml new file mode 100644 index 00000000..9f2b67da --- /dev/null +++ b/puml-files/COM/PositionsAufAbschlag.puml @@ -0,0 +1,10 @@ +@startuml +class PositionsAufAbschlag { + + Bezeichnung : string <> <> + + Beschreibung : string <> <> + + AufAbschlagswert : decimal <> <> +} +COM <|-- PositionsAufAbschlag +PositionsAufAbschlag --> "AufAbschlagstyp" AufAbschlagstyp +PositionsAufAbschlag --> "AufAbschlagswaehrung" Waehrungseinheit +@enduml diff --git a/puml-files/COM/Preis.puml b/puml-files/COM/Preis.puml new file mode 100644 index 00000000..39f83bc8 --- /dev/null +++ b/puml-files/COM/Preis.puml @@ -0,0 +1,9 @@ +@startuml +class Preis { + + Wert : decimal <> <> + + Status : Preisstatus? <> <> +} +COM <|-- Preis +Preis --> "Einheit" Waehrungseinheit +Preis --> "Bezugswert" Mengeneinheit +@enduml diff --git a/puml-files/COM/Preisgarantie.puml b/puml-files/COM/Preisgarantie.puml new file mode 100644 index 00000000..51cac4aa --- /dev/null +++ b/puml-files/COM/Preisgarantie.puml @@ -0,0 +1,8 @@ +@startuml +class Preisgarantie { + + Beschreibung : string <> <> +} +COM <|-- Preisgarantie +Preisgarantie --> "Preisgarantietyp" Preisgarantietyp +Preisgarantie --> "ZeitlicheGueltigkeit" Zeitraum +@enduml diff --git a/puml-files/COM/Preisposition.puml b/puml-files/COM/Preisposition.puml new file mode 100644 index 00000000..ec105b78 --- /dev/null +++ b/puml-files/COM/Preisposition.puml @@ -0,0 +1,18 @@ +@startuml +class Preisposition { + + Leistungsbezeichung : string <> <> + + Zeitbasis : Zeiteinheit? <> <> + + Tarifzeit : Tarifzeit? <> <> + + BdewArtikelnummer : BDEWArtikelnummer? <> <> + + Zonungsgroesse : Bemessungsgroesse? <> <> +} +class "List`1" { +} +COM <|-- Preisposition +Preisposition --> "Berechnungsmethode" Kalkulationsmethode +Preisposition --> "Leistungstyp" Leistungstyp +Preisposition --> "Preiseinheit" Waehrungseinheit +Preisposition --> "Bezugsgroesse" Mengeneinheit +Preisposition --> "Zu_abschlaege" PositionsAufAbschlag +Preisposition --> "Preisstaffeln" "List`1" +@enduml diff --git a/puml-files/COM/Preisstaffel.puml b/puml-files/COM/Preisstaffel.puml new file mode 100644 index 00000000..deeee28e --- /dev/null +++ b/puml-files/COM/Preisstaffel.puml @@ -0,0 +1,9 @@ +@startuml +class Preisstaffel { + + Einheitspreis : decimal <> <> + + StaffelgrenzeVon : decimal <> <> + + StaffelgrenzeBis : decimal <> <> +} +COM <|-- Preisstaffel +Preisstaffel --> "Sigmoidparameter" Sigmoidparameter +@enduml diff --git a/puml-files/COM/Rechnungsposition.puml b/puml-files/COM/Rechnungsposition.puml new file mode 100644 index 00000000..5a22cf6d --- /dev/null +++ b/puml-files/COM/Rechnungsposition.puml @@ -0,0 +1,21 @@ +@startuml +class Rechnungsposition { + + Positionsnummer : int <> <> + + Positionstext : string <> <> + + Zeiteinheit : Mengeneinheit? <> <> + + Artikelnummer : BDEWArtikelnummer? <> <> + + LokationsId : string <> <> + + VertragskontoId : string <> <> + + VertragsId : string <> <> + + Status : RechnungspositionsStatus? <> <> +} +COM <|-- Rechnungsposition +Rechnungsposition --> "LieferungVon" DateTime +Rechnungsposition --> "LieferungBis" DateTime +Rechnungsposition --> "PositionsMenge" Menge +Rechnungsposition --> "ZeitbezogeneMenge" Menge +Rechnungsposition --> "Einzelpreis" Preis +Rechnungsposition --> "TeilsummeNetto" Betrag +Rechnungsposition --> "TeilrabattNetto" Betrag +Rechnungsposition --> "TeilsummeSteuer" Steuerbetrag +@enduml diff --git a/puml-files/COM/RechnungspositionFlat.puml b/puml-files/COM/RechnungspositionFlat.puml new file mode 100644 index 00000000..4f891a51 --- /dev/null +++ b/puml-files/COM/RechnungspositionFlat.puml @@ -0,0 +1,22 @@ +@startuml +class RechnungspositionFlat { + + Positionsnummer : int <> <> + + Positionstext : string <> <> + + LokationsId : string <> <> + + VertragskontoId : string <> <> + + PreisWert : decimal <> <> + + PreisStatus : Preisstatus? <> <> + + PositionsMengeWert : decimal? <> <> + + PositionsMengeEinheit : Mengeneinheit? <> <> + + VertragsId : string <> <> + + Status : RechnungspositionsStatus? <> <> + + RechnungspositionFlat(rp:Rechnungsposition) + + ToRechnungsposition() : Rechnungsposition + + RechnungspositionFlat() +} +COM <|-- RechnungspositionFlat +RechnungspositionFlat --> "LieferungVon" DateTime +RechnungspositionFlat --> "LieferungBis" DateTime +RechnungspositionFlat --> "PreisEinheit" Waehrungseinheit +RechnungspositionFlat --> "PreisBezugswert" Mengeneinheit +@enduml diff --git a/puml-files/COM/RegionaleGueltigkeit.puml b/puml-files/COM/RegionaleGueltigkeit.puml new file mode 100644 index 00000000..3fe9dfbd --- /dev/null +++ b/puml-files/COM/RegionaleGueltigkeit.puml @@ -0,0 +1,9 @@ +@startuml +class RegionaleGueltigkeit { +} +class "List`1" { +} +COM <|-- RegionaleGueltigkeit +RegionaleGueltigkeit --> "Gueltigkeitstyp" Gueltigkeitstyp +RegionaleGueltigkeit --> "KriteriumsWerte" "List`1" +@enduml diff --git a/puml-files/COM/RegionalePreisgarantie.puml b/puml-files/COM/RegionalePreisgarantie.puml new file mode 100644 index 00000000..2b85e42c --- /dev/null +++ b/puml-files/COM/RegionalePreisgarantie.puml @@ -0,0 +1,6 @@ +@startuml +class RegionalePreisgarantie { +} +Preisgarantie <|-- RegionalePreisgarantie +RegionalePreisgarantie --> "RegionaleGueltigkeit" RegionaleGueltigkeit +@enduml diff --git a/puml-files/COM/RegionalePreisstaffel.puml b/puml-files/COM/RegionalePreisstaffel.puml new file mode 100644 index 00000000..beac7f5b --- /dev/null +++ b/puml-files/COM/RegionalePreisstaffel.puml @@ -0,0 +1,6 @@ +@startuml +class RegionalePreisstaffel { +} +Preisstaffel <|-- RegionalePreisstaffel +RegionalePreisstaffel --> "RegionaleGueltigkeit" RegionaleGueltigkeit +@enduml diff --git a/puml-files/COM/RegionaleTarifpreisposition.puml b/puml-files/COM/RegionaleTarifpreisposition.puml new file mode 100644 index 00000000..6165f091 --- /dev/null +++ b/puml-files/COM/RegionaleTarifpreisposition.puml @@ -0,0 +1,12 @@ +@startuml +class RegionaleTarifpreisposition { + + Einheit : string <> <> + + Mengeneinheitstaffel : Mengeneinheit? <> <> +} +class "List`1" { +} +COM <|-- RegionaleTarifpreisposition +RegionaleTarifpreisposition --> "Preistyp" Preistyp +RegionaleTarifpreisposition --> "Bezugseinheit" Mengeneinheit +RegionaleTarifpreisposition --> "Preisstaffeln" "List`1" +@enduml diff --git a/puml-files/COM/RegionalerAufAbschlag.puml b/puml-files/COM/RegionalerAufAbschlag.puml new file mode 100644 index 00000000..acc93045 --- /dev/null +++ b/puml-files/COM/RegionalerAufAbschlag.puml @@ -0,0 +1,22 @@ +@startuml +class RegionalerAufAbschlag { + + Bezeichnung : string <> <> + + Beschreibung : string <> <> + + AufAbschlagstyp : AufAbschlagstyp? <> <> + + AufAbschlagsziel : AufAbschlagsziel? <> <> + + Einheit : Waehrungseinheit? <> <> + + Website : string <> <> + + Tarifnamensaenderungen : string <> <> +} +class "List`1" { +} +COM <|-- RegionalerAufAbschlag +RegionalerAufAbschlag --> "Zusatzprodukte" "List`1" +RegionalerAufAbschlag --> "Voraussetzungen" "List`1" +RegionalerAufAbschlag --> "Gueltigkeitszeitraum" Zeitraum +RegionalerAufAbschlag --> "Energiemixaenderung" Energiemix +RegionalerAufAbschlag --> "Vertagskonditionsaenderung" Vertragskonditionen +RegionalerAufAbschlag --> "Garantieaenderung" Preisgarantie +RegionalerAufAbschlag --> "Einschraenkungsaenderung" Tarifeinschraenkung +RegionalerAufAbschlag --> "Staffeln" "List`1" +@enduml diff --git a/puml-files/COM/Regionskriterium.puml b/puml-files/COM/Regionskriterium.puml new file mode 100644 index 00000000..738f622b --- /dev/null +++ b/puml-files/COM/Regionskriterium.puml @@ -0,0 +1,10 @@ +@startuml +class Regionskriterium { + + Sparte : Sparte? <> <> + + Wert : string <> <> +} +COM <|-- Regionskriterium +Regionskriterium --> "Gueltigkeitstyp" Gueltigkeitstyp +Regionskriterium --> "Mengenoperator" Mengenoperator +Regionskriterium --> "Regionskriteriumtyp" Regionskriteriumtyp +@enduml diff --git a/puml-files/COM/Rufnummer.puml b/puml-files/COM/Rufnummer.puml new file mode 100644 index 00000000..6d52f546 --- /dev/null +++ b/puml-files/COM/Rufnummer.puml @@ -0,0 +1,7 @@ +@startuml +class Rufnummer { + + rufnummer : string <> <> +} +COM <|-- Rufnummer +Rufnummer --> "Nummerntyp" Rufnummernart +@enduml diff --git a/puml-files/COM/Sigmoidparameter.puml b/puml-files/COM/Sigmoidparameter.puml new file mode 100644 index 00000000..40443b56 --- /dev/null +++ b/puml-files/COM/Sigmoidparameter.puml @@ -0,0 +1,9 @@ +@startuml +class Sigmoidparameter { + + A : decimal <> <> + + B : decimal <> <> + + C : decimal <> <> + + D : decimal <> <> +} +COM <|-- Sigmoidparameter +@enduml diff --git a/puml-files/COM/Steuerbetrag.puml b/puml-files/COM/Steuerbetrag.puml new file mode 100644 index 00000000..90d232e6 --- /dev/null +++ b/puml-files/COM/Steuerbetrag.puml @@ -0,0 +1,9 @@ +@startuml +class Steuerbetrag { + + Basiswert : decimal <> <> + + Steuerwert : decimal <> <> +} +COM <|-- Steuerbetrag +Steuerbetrag --> "Steuerkennzeichen" Steuerkennzeichen +Steuerbetrag --> "Waehrung" Waehrungscode +@enduml diff --git a/puml-files/COM/Tarifberechnungsparameter.puml b/puml-files/COM/Tarifberechnungsparameter.puml new file mode 100644 index 00000000..c556c662 --- /dev/null +++ b/puml-files/COM/Tarifberechnungsparameter.puml @@ -0,0 +1,14 @@ +@startuml +class Tarifberechnungsparameter { + + Berechnungsmethode : Tarifkalkulationsmethode? <> <> + + MesspreisInGPEnthalten : string <> <> + + Messpreistyp : Messpreistyp? <> <> + + KwInklusive : decimal? <> <> + + KwWeitereMengen : decimal? <> <> + + MesspreisBeruecksichtigen : bool? <> <> +} +COM <|-- Tarifberechnungsparameter +Tarifberechnungsparameter --> "HoechstpreisNT" Preis +Tarifberechnungsparameter --> "HoechstpreisHT" Preis +Tarifberechnungsparameter --> "Mindestpreis" Preis +@enduml diff --git a/puml-files/COM/Tarifeinschraenkung.puml b/puml-files/COM/Tarifeinschraenkung.puml new file mode 100644 index 00000000..340ff308 --- /dev/null +++ b/puml-files/COM/Tarifeinschraenkung.puml @@ -0,0 +1,11 @@ +@startuml +class Tarifeinschraenkung { +} +class "List`1" { +} +COM <|-- Tarifeinschraenkung +Tarifeinschraenkung --> "Zusatzprodukte" "List`1" +Tarifeinschraenkung --> "Voraussetzungen" "List`1" +Tarifeinschraenkung --> "Einschraenkungzaehler" Geraet +Tarifeinschraenkung --> "Einschraenkungleistung" Menge +@enduml diff --git a/puml-files/COM/Tarifpreisposition.puml b/puml-files/COM/Tarifpreisposition.puml new file mode 100644 index 00000000..3b4592e6 --- /dev/null +++ b/puml-files/COM/Tarifpreisposition.puml @@ -0,0 +1,10 @@ +@startuml +class Tarifpreisposition { + + Mengeneinheitstaffel : Mengeneinheit? <> <> +} +COM <|-- Tarifpreisposition +Tarifpreisposition --> "Preistyp" Preistyp +Tarifpreisposition --> "Einheit" Waehrungseinheit +Tarifpreisposition --> "Bezugseinheit" Mengeneinheit +Tarifpreisposition --> "Preisstaffeln" Preisstaffel +@enduml diff --git a/puml-files/COM/Unterschrift.puml b/puml-files/COM/Unterschrift.puml new file mode 100644 index 00000000..c7d5560f --- /dev/null +++ b/puml-files/COM/Unterschrift.puml @@ -0,0 +1,8 @@ +@startuml +class Unterschrift { + + Ort : string <> <> + + Datum : DateTime? <> <> + + Name : string <> <> +} +COM <|-- Unterschrift +@enduml diff --git a/puml-files/COM/Verbrauch.puml b/puml-files/COM/Verbrauch.puml new file mode 100644 index 00000000..d30c8284 --- /dev/null +++ b/puml-files/COM/Verbrauch.puml @@ -0,0 +1,25 @@ +@startuml +class Verbrauch { + {static} Verbrauch() + + Obiskennzahl : string <> <> + + Wert : decimal <> <> + + Type : Verbrauchsmengetyp? <> <> + + {static} FixSapCdsBug(v:Verbrauch) : Verbrauch + + FixSapCdsBug() : void +} +enum SapTimezone { + UTC, + GMT, + CET, + MEZ, + CEST, + MESZ, +} +COM <|-- Verbrauch +Verbrauch --> "CENTRAL_EUROPE_STANDARD_TIME" TimeZoneInfo +Verbrauch --> "Startdatum" DateTime +Verbrauch --> "Enddatum" DateTime +Verbrauch --> "Wertermittlungsverfahren" Wertermittlungsverfahren +Verbrauch --> "Einheit" Mengeneinheit +Verbrauch +-- SapTimezone +@enduml diff --git a/puml-files/COM/Vertragskonditionen.puml b/puml-files/COM/Vertragskonditionen.puml new file mode 100644 index 00000000..87bdbd68 --- /dev/null +++ b/puml-files/COM/Vertragskonditionen.puml @@ -0,0 +1,21 @@ +@startuml +class Vertragskonditionen { + + Beschreibung : string <> <> + + AnzahlAbschlaege : int? <> <> + + StartAbrechnungsjahr : DateTime? <> <> + + TurnusablesungIntervall : int? <> <> + + NetznutzungsabrechnungIntervall : int? <> <> + + Haushaltskunde : bool? <> <> + + Netznutzungsvertrag : NetznutzungsVertrag? <> <> + + Netznutzungszahler : Netznutzungszahler? <> <> + + Netznutzungsabrechnungsvariante : Netznutzungsabrechnungsvariante? <> <> + + Netznutzungsabrechnungsgrundlage : Netznutzungsabrechnungsgrundlage? <> <> +} +COM <|-- Vertragskonditionen +Vertragskonditionen --> "Vertragslaufzeit" Zeitraum +Vertragskonditionen --> "Kuendigungsfrist" Zeitraum +Vertragskonditionen --> "Vertragsverlaengerung" Zeitraum +Vertragskonditionen --> "Abschlagszyklus" Zeitraum +Vertragskonditionen --> "GeplanteTurnusablesung" Zeitraum +Vertragskonditionen --> "Netznutzungsabrechnung" Zeitraum +@enduml diff --git a/puml-files/COM/Vertragsteil.puml b/puml-files/COM/Vertragsteil.puml new file mode 100644 index 00000000..1fbc00c0 --- /dev/null +++ b/puml-files/COM/Vertragsteil.puml @@ -0,0 +1,14 @@ +@startuml +class Vertragsteil { + + Lokation : string <> <> + + Verbrauchsaufteilung : string <> <> +} +COM <|-- Vertragsteil +Vertragsteil --> "Vertragsteilbeginn" DateTime +Vertragsteil --> "Vertragsteilende" DateTime +Vertragsteil --> "VertraglichFixierteMenge" Menge +Vertragsteil --> "MinimaleAbnahmemenge" Menge +Vertragsteil --> "MaximaleAbnahmemenge" Menge +Vertragsteil --> "Jahresverbrauchsprognose" Menge +Vertragsteil --> "Kundenwert" Menge +@enduml diff --git a/puml-files/COM/Zaehlwerk.puml b/puml-files/COM/Zaehlwerk.puml new file mode 100644 index 00000000..15084476 --- /dev/null +++ b/puml-files/COM/Zaehlwerk.puml @@ -0,0 +1,23 @@ +@startuml +class Zaehlwerk { + + ZaehlwerkId : string <> <> + + Bezeichnung : string <> <> + + ObisKennzahl : string <> <> + + Wandlerfaktor : decimal <> <> + + Kennzahl : string <> <> + + Schwachlastfaehig : Schwachlastfaehig? <> <> + + Verbrauchsart : Verbrauchsart? <> <> + + Unterbrechbarkeit : Unterbrechbarkeit? <> <> + + Waermenutzung : Waermenutzung? <> <> + + Steuerbefreit : bool? <> <> + + Vorkommastelle : int? <> <> + + Nachkommastelle : int? <> <> +} +class "List`1" { +} +COM <|-- Zaehlwerk +Zaehlwerk --> "Richtung" Energierichtung +Zaehlwerk --> "Einheit" Mengeneinheit +Zaehlwerk --> "Verwendungszwecke" "List`1" +Zaehlwerk --> "Konzessionsabgabe" Konzessionsabgabe +@enduml diff --git a/puml-files/COM/Zeitraum.puml b/puml-files/COM/Zeitraum.puml new file mode 100644 index 00000000..959215e2 --- /dev/null +++ b/puml-files/COM/Zeitraum.puml @@ -0,0 +1,10 @@ +@startuml +class Zeitraum { + + Einheit : Zeiteinheit? <> <> + + Dauer : decimal? <> <> + + Startdatum : DateTime? <> <> + + Enddatum : DateTime? <> <> + + FillNullValues(context:StreamingContext) : void +} +COM <|-- Zeitraum +@enduml diff --git a/puml-files/COM/Zustaendigkeit.puml b/puml-files/COM/Zustaendigkeit.puml new file mode 100644 index 00000000..aa62f0d0 --- /dev/null +++ b/puml-files/COM/Zustaendigkeit.puml @@ -0,0 +1,8 @@ +@startuml +class Zustaendigkeit { + + Jobtitel : string <> <> + + Abteilung : string <> <> + + Themengebiet : string <> <> +} +COM <|-- Zustaendigkeit +@enduml diff --git a/puml-files/ENUM/AbgabeArt.puml b/puml-files/ENUM/AbgabeArt.puml new file mode 100644 index 00000000..504a1a19 --- /dev/null +++ b/puml-files/ENUM/AbgabeArt.puml @@ -0,0 +1,13 @@ +@startuml +enum AbgabeArt { + KAS, + SA, + SAS, + TA, + TAS, + TK, + TKS, + TS, + TSS, +} +@enduml diff --git a/puml-files/ENUM/Angebotsstatus.puml b/puml-files/ENUM/Angebotsstatus.puml new file mode 100644 index 00000000..212b3eef --- /dev/null +++ b/puml-files/ENUM/Angebotsstatus.puml @@ -0,0 +1,13 @@ +@startuml +enum Angebotsstatus { + KONZEPTION, + UNVERBINDLICH, + VERBINDLICH, + BEAUFTRAGT, + UNGUELTIG, + ABGELEHNT, + NACHGEFASST, + AUSSTEHEND, + ERLEDIGT, +} +@enduml diff --git a/puml-files/ENUM/Anrede.puml b/puml-files/ENUM/Anrede.puml new file mode 100644 index 00000000..022593a9 --- /dev/null +++ b/puml-files/ENUM/Anrede.puml @@ -0,0 +1,10 @@ +@startuml +enum Anrede { + HERR, + FRAU, + EHELEUTE, + FIRMA, + INDIVIDUELL, + DR, +} +@enduml diff --git a/puml-files/ENUM/ArithmetischeOperation.puml b/puml-files/ENUM/ArithmetischeOperation.puml new file mode 100644 index 00000000..d834f7a5 --- /dev/null +++ b/puml-files/ENUM/ArithmetischeOperation.puml @@ -0,0 +1,8 @@ +@startuml +enum ArithmetischeOperation { + ADDITION, + SUBTRAKTION, + MULTIPLIKATION, + DIVISION, +} +@enduml diff --git a/puml-files/ENUM/AufAbschlagstyp.puml b/puml-files/ENUM/AufAbschlagstyp.puml new file mode 100644 index 00000000..ad1b5c89 --- /dev/null +++ b/puml-files/ENUM/AufAbschlagstyp.puml @@ -0,0 +1,6 @@ +@startuml +enum AufAbschlagstyp { + RELATIV, + ABSOLUT, +} +@enduml diff --git a/puml-files/ENUM/AufAbschlagsziel.puml b/puml-files/ENUM/AufAbschlagsziel.puml new file mode 100644 index 00000000..b190761c --- /dev/null +++ b/puml-files/ENUM/AufAbschlagsziel.puml @@ -0,0 +1,9 @@ +@startuml +enum AufAbschlagsziel { + ARBEITSPREIS_HT, + ARBEITSPREIS_NT, + ARBEITSPREIS_HT_NT, + GRUNDPREIS, + GESAMTPREIS, +} +@enduml diff --git a/puml-files/ENUM/Ausschreibungsportal.puml b/puml-files/ENUM/Ausschreibungsportal.puml new file mode 100644 index 00000000..56b8350a --- /dev/null +++ b/puml-files/ENUM/Ausschreibungsportal.puml @@ -0,0 +1,14 @@ +@startuml +enum Ausschreibungsportal { + ENPORTAL, + ENERGIE_AGENTUR, + BMWI, + ENERGIE_HANDELSPLATZ, + BUND, + VERA_ONLINE, + ISPEX, + ENERGIEMARKTPLATZ, + EVERGABE, + DTAD, +} +@enduml diff --git a/puml-files/ENUM/Ausschreibungsstatus.puml b/puml-files/ENUM/Ausschreibungsstatus.puml new file mode 100644 index 00000000..e10e1e0d --- /dev/null +++ b/puml-files/ENUM/Ausschreibungsstatus.puml @@ -0,0 +1,8 @@ +@startuml +enum Ausschreibungsstatus { + PHASE1, + PHASE2, + PHASE3, + PHASE4, +} +@enduml diff --git a/puml-files/ENUM/Ausschreibungstyp.puml b/puml-files/ENUM/Ausschreibungstyp.puml new file mode 100644 index 00000000..5d8e892b --- /dev/null +++ b/puml-files/ENUM/Ausschreibungstyp.puml @@ -0,0 +1,6 @@ +@startuml +enum Ausschreibungstyp { + OEFFENTLICHRECHTLICH, + EUROPAWEIT, +} +@enduml diff --git a/puml-files/ENUM/BDEWArtikelnummer.puml b/puml-files/ENUM/BDEWArtikelnummer.puml new file mode 100644 index 00000000..93b7bdc5 --- /dev/null +++ b/puml-files/ENUM/BDEWArtikelnummer.puml @@ -0,0 +1,49 @@ +@startuml +enum BDEWArtikelnummer { + LEISTUNG, + LEISTUNG_PAUSCHAL, + GRUNDPREIS, + REGELENERGIE_ARBEIT, + REGELENERGIE_LEISTUNG, + NOTSTROMLIEFERUNG_ARBEIT, + NOTSTROMLIEFERUNG_LEISTUNG, + RESERVENETZKAPAZITAET, + RESERVELEISTUNG, + ZUSAETZLICHE_ABLESUNG, + PRUEFGEBUEHREN_AUSSERPLANMAESSIG, + WIRKARBEIT, + SINGULAER_GENUTZTE_BETRIEBSMITTEL, + ABGABE_KWKG, + ABSCHLAG, + KONZESSIONSABGABE, + ENTGELT_FERNAUSLESUNG, + UNTERMESSUNG, + BLINDMEHRARBEIT, + ENTGELT_ABRECHNUNG, + SPERRKOSTEN, + ENTSPERRKOSTEN, + MAHNKOSTEN, + MEHR_MINDERMENGEN, + INKASSOKOSTEN, + BLINDMEHRLEISTUNG, + ENTGELT_MESSUNG_ABLESUNG, + ENTGELT_EINBAU_BETRIEB_WARTUNG_MESSTECHNIK, + AUSGLEICHSENERGIE, + ZAEHLEINRICHTUNG, + WANDLER_MENGENUMWERTER, + KOMMUNIKATIONSEINRICHTUNG, + TECHNISCHE_STEUEREINRICHTUNG, + PARAGRAF_19_STROM_NEV_UMLAGE, + BEFESTIGUNGSEINRICHTUNG, + OFFSHORE_HAFTUNGSUMLAGE, + FIXE_ARBEITSENTGELTKOMPONENTE, + FIXE_LEISTUNGSENTGELTKOMPONENTE, + UMLAGE_ABSCHALTBARE_LASTEN, + MEHRMENGE, + MINDERMENGE, + ENERGIESTEUER, + SMARTMETER_GATEWAY, + STEUERBOX, + MSB_INKL_MESSUNG, +} +@enduml diff --git a/puml-files/ENUM/Bearbeitungsstatus.puml b/puml-files/ENUM/Bearbeitungsstatus.puml new file mode 100644 index 00000000..28c42459 --- /dev/null +++ b/puml-files/ENUM/Bearbeitungsstatus.puml @@ -0,0 +1,10 @@ +@startuml +enum Bearbeitungsstatus { + OFFEN, + IN_BEARBEITUNG, + ABGESCHLOSSEN, + STORNIERT, + QUITTIERT, + IGNORIERT, +} +@enduml diff --git a/puml-files/ENUM/Bemessungsgroesse.puml b/puml-files/ENUM/Bemessungsgroesse.puml new file mode 100644 index 00000000..c0b7fdc0 --- /dev/null +++ b/puml-files/ENUM/Bemessungsgroesse.puml @@ -0,0 +1,16 @@ +@startuml +enum Bemessungsgroesse { + WIRKARBEIT_EL, + LEISTUNG_EL, + BLINDARBEIT_KAP, + BLINDARBEIT_IND, + BLINDLEISTUNG_KAP, + BLINDLEISTUNG_IND, + WIRKARBEIT_TH, + LEISTUNG_TH, + VOLUMEN, + VOLUMENSTROM, + BENUTZUNGSDAUER, + ANZAHL, +} +@enduml diff --git a/puml-files/ENUM/Bilanzierungsmethode.puml b/puml-files/ENUM/Bilanzierungsmethode.puml new file mode 100644 index 00000000..304a0195 --- /dev/null +++ b/puml-files/ENUM/Bilanzierungsmethode.puml @@ -0,0 +1,10 @@ +@startuml +enum Bilanzierungsmethode { + RLM, + SLP, + TLP_GEMEINSAM, + TLP_GETRENNT, + PAUSCHAL, + IMS, +} +@enduml diff --git a/puml-files/ENUM/BoTyp.puml b/puml-files/ENUM/BoTyp.puml new file mode 100644 index 00000000..cf2bdff0 --- /dev/null +++ b/puml-files/ENUM/BoTyp.puml @@ -0,0 +1,22 @@ +@startuml +enum BoTyp { + ANSPRECHPARTNER, + ENERGIEMENGE, + GESCHAEFTSOBJEKT, + GESCHAEFTSPARTNER, + MARKTLOKATION, + MARKTTEILNEHMER, + MESSLOKATION, + ZAEHLER, + KOSTEN, + TARIF, + PREISBLATT, + PREISBLATTNETZNUTZUNG, + PREISBLATTMESSUNG, + PREISBLATTUMLAGEN, + PREISBLATTDIENSTLEISTUNG, + PREISBLATTKONZESSIONSABGABE, + ZEITREIHE, + LASTGANG, +} +@enduml diff --git a/puml-files/ENUM/Dienstleistungstyp.puml b/puml-files/ENUM/Dienstleistungstyp.puml new file mode 100644 index 00000000..73a7738b --- /dev/null +++ b/puml-files/ENUM/Dienstleistungstyp.puml @@ -0,0 +1,43 @@ +@startuml +enum Dienstleistungstyp { + DATENBEREITSTELLUNG_TAEGLICH, + DATENBEREITSTELLUNG_WOECHENTLICH, + DATENBEREITSTELLUNG_MONATLICH, + DATENBEREITSTELLUNG_JAEHRLICH, + DATENBEREITSTELLUNG_HISTORISCHE_LG, + DATENBEREITSTELLUNG_STUENDLICH, + DATENBEREITSTELLUNG_VIERTELJAEHRLICH, + DATENBEREITSTELLUNG_HALBJAEHRLICH, + DATENBEREITSTELLUNG_MONATLICH_ZUSAETZLICH, + DATENBEREITSTELLUNG_EINMALIG, + AUSLESUNG_2X_TAEGLICH_FERNAUSLESUNG, + AUSLESUNG_TAEGLICH_FERNAUSLESUNG, + AUSLESUNG_LGK_MANUELL_MSB, + AUSLESUNG_MONATLICH_SLP_FERNAUSLESUNG, + AUSLESUNG_JAEHRLICH_SLP_FERNAUSLESUNG, + AUSLESUNG_MDE_SLP, + ABLESUNG_MONATLICH_SLP, + ABLESUNG_VIERTELJAEHRLICH_SLP, + ABLESUNG_HALBJAEHRLICH_SLP, + ABLESUNG_JAEHRLICH_SLP, + AUSLESUNG_SLP_FERNAUSLESUNG, + ABLESUNG_SLP_ZUSAETZLICH_MSB, + ABLESUNG_SLP_ZUSAETZLICH_KUNDE, + AUSLESUNG_LGK_FERNAUSLESUNG_ZUSAETZLICH_MSB, + AUSLESUNG_MOATLICH_FERNAUSLESUNG, + AUSLESUNG_STUENDLICH_FERNAUSLESUNG, + ABLESUNG_MONATLICH_LGK, + AUSLESUNG_TEMERATURMENGENUMWERTER, + AUSLESUNG_ZUSTANDSMENGENUMWERTER, + AUSLESUNG_SYSTEMMENGENUMWERTER, + AUSLESUNG_VORGANG_SLP, + AUSLESUUNG_KOMPAKTMENGENUMWERTER, + AUSLESUNG_MDE_LGK, + SPERRUNG_SLP, + ENTSPERRUNG_SLP, + SPERRUNG_RLM, + ENTSPERRUNG_RLM, + MAHNKOSTEN, + INKASSOKOSTEN, +} +@enduml diff --git a/puml-files/ENUM/EDI/BDEWArtikelnummerEdi.puml b/puml-files/ENUM/EDI/BDEWArtikelnummerEdi.puml new file mode 100644 index 00000000..350943e0 --- /dev/null +++ b/puml-files/ENUM/EDI/BDEWArtikelnummerEdi.puml @@ -0,0 +1,49 @@ +@startuml +enum BDEWArtikelnummerEdi { + _9990001000053, + _9990001000079, + _9990001000087, + _9990001000128, + _9990001000136, + _9990001000144, + _9990001000152, + _9990001000160, + _9990001000178, + _9990001000186, + _9990001000219, + _9990001000269, + _9990001000285, + _9990001000334, + _9990001000376, + _9990001000417, + _9990001000433, + _9990001000475, + _9990001000508, + _9990001000532, + _9990001000540, + _9990001000558, + _9990001000566, + _9990001000574, + _9990001000582, + _9990001000590, + _9990001000615, + _9990001000623, + _9990001000631, + _9990001000649, + _9990001000657, + _9990001000665, + _9990001000673, + _9990001000681, + _9990001000699, + _9990001000706, + _9990001000714, + _9990001000722, + _9990001000730, + _9990001000748, + _9990001000756, + _9990001000764, + _9990001000772, + _9990001000780, + _9990001000798, +} +@enduml diff --git a/puml-files/ENUM/EDI/EnergierichtungEdi.puml b/puml-files/ENUM/EDI/EnergierichtungEdi.puml new file mode 100644 index 00000000..571148b4 --- /dev/null +++ b/puml-files/ENUM/EDI/EnergierichtungEdi.puml @@ -0,0 +1,6 @@ +@startuml +enum EnergierichtungEdi { + Z06, + Z07, +} +@enduml diff --git a/puml-files/ENUM/EDI/FernschaltungEdi.puml b/puml-files/ENUM/EDI/FernschaltungEdi.puml new file mode 100644 index 00000000..79285b05 --- /dev/null +++ b/puml-files/ENUM/EDI/FernschaltungEdi.puml @@ -0,0 +1,6 @@ +@startuml +enum FernschaltungEdi { + Z06, + Z07, +} +@enduml diff --git a/puml-files/ENUM/EDI/GeraetetypEdi.puml b/puml-files/ENUM/EDI/GeraetetypEdi.puml new file mode 100644 index 00000000..05d99ccb --- /dev/null +++ b/puml-files/ENUM/EDI/GeraetetypEdi.puml @@ -0,0 +1,17 @@ +@startuml +enum GeraetetypEdi { + AHZ, + WSZ, + LAZ, + MAZ, + MME, + DKZ, + BGZ, + TRZ, + UGZ, + WGZ, + MRG, + EHZ, + IVA, +} +@enduml diff --git a/puml-files/ENUM/EDI/GeschaeftspartnerrolleEdi.puml b/puml-files/ENUM/EDI/GeschaeftspartnerrolleEdi.puml new file mode 100644 index 00000000..21ad33dd --- /dev/null +++ b/puml-files/ENUM/EDI/GeschaeftspartnerrolleEdi.puml @@ -0,0 +1,10 @@ +@startuml +enum GeschaeftspartnerrolleEdi { + SU, + DEB, + UD, + MS, + MR, + VY, +} +@enduml diff --git a/puml-files/ENUM/EDI/KontaktartEdi.puml b/puml-files/ENUM/EDI/KontaktartEdi.puml new file mode 100644 index 00000000..5d12a539 --- /dev/null +++ b/puml-files/ENUM/EDI/KontaktartEdi.puml @@ -0,0 +1,9 @@ +@startuml +enum KontaktartEdi { + EM, + FX, + TE, + AJ, + AL, +} +@enduml diff --git a/puml-files/ENUM/EDI/MesswerterfassungEdi.puml b/puml-files/ENUM/EDI/MesswerterfassungEdi.puml new file mode 100644 index 00000000..b3b7456d --- /dev/null +++ b/puml-files/ENUM/EDI/MesswerterfassungEdi.puml @@ -0,0 +1,6 @@ +@startuml +enum MesswerterfassungEdi { + AMR, + MMR, +} +@enduml diff --git a/puml-files/ENUM/EDI/NetzebeneEdi.puml b/puml-files/ENUM/EDI/NetzebeneEdi.puml new file mode 100644 index 00000000..62222d9e --- /dev/null +++ b/puml-files/ENUM/EDI/NetzebeneEdi.puml @@ -0,0 +1,14 @@ +@startuml +enum NetzebeneEdi { + E03, + E04, + E05, + E06, + E07, + E08, + E09, + Y01, + Y02, + Y03, +} +@enduml diff --git a/puml-files/ENUM/EDI/NetznutzungsabrechnungsgrundlageEdi.puml b/puml-files/ENUM/EDI/NetznutzungsabrechnungsgrundlageEdi.puml new file mode 100644 index 00000000..938a8ade --- /dev/null +++ b/puml-files/ENUM/EDI/NetznutzungsabrechnungsgrundlageEdi.puml @@ -0,0 +1,6 @@ +@startuml +enum NetznutzungsabrechnungsgrundlageEdi { + Z12, + Z13, +} +@enduml diff --git a/puml-files/ENUM/EDI/NetznutzungsabrechnungsvarianteEdi.puml b/puml-files/ENUM/EDI/NetznutzungsabrechnungsvarianteEdi.puml new file mode 100644 index 00000000..e2944932 --- /dev/null +++ b/puml-files/ENUM/EDI/NetznutzungsabrechnungsvarianteEdi.puml @@ -0,0 +1,6 @@ +@startuml +enum NetznutzungsabrechnungsvarianteEdi { + Z14, + Z15, +} +@enduml diff --git a/puml-files/ENUM/EDI/NetznutzungsvertragEdi.puml b/puml-files/ENUM/EDI/NetznutzungsvertragEdi.puml new file mode 100644 index 00000000..2db25f34 --- /dev/null +++ b/puml-files/ENUM/EDI/NetznutzungsvertragEdi.puml @@ -0,0 +1,6 @@ +@startuml +enum NetznutzungsvertragEdi { + Z08, + Z09, +} +@enduml diff --git a/puml-files/ENUM/EDI/NetznutzungszahlerEdi.puml b/puml-files/ENUM/EDI/NetznutzungszahlerEdi.puml new file mode 100644 index 00000000..e19bb365 --- /dev/null +++ b/puml-files/ENUM/EDI/NetznutzungszahlerEdi.puml @@ -0,0 +1,6 @@ +@startuml +enum NetznutzungszahlerEdi { + Z10, + Z11, +} +@enduml diff --git a/puml-files/ENUM/EDI/RollencodetypEdi.puml b/puml-files/ENUM/EDI/RollencodetypEdi.puml new file mode 100644 index 00000000..5a010f5f --- /dev/null +++ b/puml-files/ENUM/EDI/RollencodetypEdi.puml @@ -0,0 +1,6 @@ +@startuml +enum RollencodetypEdi { + _293, + _332, +} +@enduml diff --git a/puml-files/ENUM/EDI/SchwachlastfaehigEdi.puml b/puml-files/ENUM/EDI/SchwachlastfaehigEdi.puml new file mode 100644 index 00000000..72b07ce8 --- /dev/null +++ b/puml-files/ENUM/EDI/SchwachlastfaehigEdi.puml @@ -0,0 +1,6 @@ +@startuml +enum SchwachlastfaehigEdi { + Z59, + Z60, +} +@enduml diff --git a/puml-files/ENUM/EDI/TarifartEdi.puml b/puml-files/ENUM/EDI/TarifartEdi.puml new file mode 100644 index 00000000..fff8f9c5 --- /dev/null +++ b/puml-files/ENUM/EDI/TarifartEdi.puml @@ -0,0 +1,7 @@ +@startuml +enum TarifartEdi { + ETZ, + ZTZ, + NTZ, +} +@enduml diff --git a/puml-files/ENUM/EDI/UTILMD/UTILMD7433.puml b/puml-files/ENUM/EDI/UTILMD/UTILMD7433.puml new file mode 100644 index 00000000..a00d7fe6 --- /dev/null +++ b/puml-files/ENUM/EDI/UTILMD/UTILMD7433.puml @@ -0,0 +1,62 @@ +@startuml +enum UTILMD9013 { + E01, + E02, + E03, + E05, + E06, + E11, + E15, + E17, + Z01, + Z09, + Z15, + Z26, + Z29, + Z33, + Z37, + Z38, + Z39, + Z40, + Z41, + Z44, + Z69, + ZB2, + ZB3, + ZB6, + ZC6, + ZC7, + ZC8, + ZG9, + ZH0, + ZH1, + ZH2, + ZD0, + ZD9, + ZE3, + ZE4, + ZE5, + ZE6, + ZE7, + ZE8, + ZE9, + ZF0, + ZF1, + ZF2, + ZF3, + ZF4, + ZF5, + ZF6, + ZF7, + ZF8, + ZG5, + ZG6, + ZG7, + ZG8, + ZI8, + ZI9, + ZJ0, + ZJ1, + ZJ4, +} +@enduml diff --git a/puml-files/ENUM/EDI/UTILMD/UTILMD9013.puml b/puml-files/ENUM/EDI/UTILMD/UTILMD9013.puml new file mode 100644 index 00000000..635f4f49 --- /dev/null +++ b/puml-files/ENUM/EDI/UTILMD/UTILMD9013.puml @@ -0,0 +1,6 @@ +@startuml +enum UTILMD7433 { + Z04, + Z06, +} +@enduml diff --git a/puml-files/ENUM/EDI/UnterbrechbarkeitEdi.puml b/puml-files/ENUM/EDI/UnterbrechbarkeitEdi.puml new file mode 100644 index 00000000..c17ed830 --- /dev/null +++ b/puml-files/ENUM/EDI/UnterbrechbarkeitEdi.puml @@ -0,0 +1,6 @@ +@startuml +enum UnterbrechbarkeitEdi { + Unterbrechbare_Verbrauchseinrichtung, + Nicht_Unterbrechbare_Verbrauchseinrichtung, +} +@enduml diff --git a/puml-files/ENUM/EDI/VerbrauchsartEdi.puml b/puml-files/ENUM/EDI/VerbrauchsartEdi.puml new file mode 100644 index 00000000..f998792b --- /dev/null +++ b/puml-files/ENUM/EDI/VerbrauchsartEdi.puml @@ -0,0 +1,7 @@ +@startuml +enum VerbrauchsartEdi { + Z64, + Z65, + Z66, +} +@enduml diff --git a/puml-files/ENUM/EDI/VerwendungszweckEdi.puml b/puml-files/ENUM/EDI/VerwendungszweckEdi.puml new file mode 100644 index 00000000..48b08fa3 --- /dev/null +++ b/puml-files/ENUM/EDI/VerwendungszweckEdi.puml @@ -0,0 +1,8 @@ +@startuml +enum VerwendungszweckEdi { + Z84, + Z85, + Z86, + Z47, +} +@enduml diff --git a/puml-files/ENUM/EDI/WaehrungseinheitEdi.puml b/puml-files/ENUM/EDI/WaehrungseinheitEdi.puml new file mode 100644 index 00000000..066aba37 --- /dev/null +++ b/puml-files/ENUM/EDI/WaehrungseinheitEdi.puml @@ -0,0 +1,5 @@ +@startuml +enum WaehrungseinheitEdi { + EUR, +} +@enduml diff --git a/puml-files/ENUM/EDI/WaermenutzungEdi.puml b/puml-files/ENUM/EDI/WaermenutzungEdi.puml new file mode 100644 index 00000000..a8f4b554 --- /dev/null +++ b/puml-files/ENUM/EDI/WaermenutzungEdi.puml @@ -0,0 +1,7 @@ +@startuml +enum WaermenutzungEdi { + Z56, + Z57, + Z61, +} +@enduml diff --git a/puml-files/ENUM/EDI/WertermittelungsverfahrenEdi.puml b/puml-files/ENUM/EDI/WertermittelungsverfahrenEdi.puml new file mode 100644 index 00000000..a3998bff --- /dev/null +++ b/puml-files/ENUM/EDI/WertermittelungsverfahrenEdi.puml @@ -0,0 +1,8 @@ +@startuml +enum WertermittlungsverfahrenEdi { + _220, + _67, + _201, + _20, +} +@enduml diff --git a/puml-files/ENUM/EDI/ZaehlerauspraegungEdi.puml b/puml-files/ENUM/EDI/ZaehlerauspraegungEdi.puml new file mode 100644 index 00000000..e2469a9b --- /dev/null +++ b/puml-files/ENUM/EDI/ZaehlerauspraegungEdi.puml @@ -0,0 +1,6 @@ +@startuml +enum ZaehlerauspraegungEdi { + ERZ, + ZRZ, +} +@enduml diff --git a/puml-files/ENUM/EDI/ZaehlertypEdi.puml b/puml-files/ENUM/EDI/ZaehlertypEdi.puml new file mode 100644 index 00000000..22c15c03 --- /dev/null +++ b/puml-files/ENUM/EDI/ZaehlertypEdi.puml @@ -0,0 +1,17 @@ +@startuml +enum ZaehlertypEdi { + AHZ, + WSZ, + LAZ, + MAZ, + MME, + DKZ, + BGZ, + TRZ, + UGZ, + WGZ, + MRG, + EHZ, + IVA, +} +@enduml diff --git a/puml-files/ENUM/EDI/ZeiteinheitEdi.puml b/puml-files/ENUM/EDI/ZeiteinheitEdi.puml new file mode 100644 index 00000000..b497ef0c --- /dev/null +++ b/puml-files/ENUM/EDI/ZeiteinheitEdi.puml @@ -0,0 +1,5 @@ +@startuml +enum ZeiteinheitEdi { + ANN, +} +@enduml diff --git a/puml-files/ENUM/EncryptionScheme.puml b/puml-files/ENUM/EncryptionScheme.puml new file mode 100644 index 00000000..9b342e3d --- /dev/null +++ b/puml-files/ENUM/EncryptionScheme.puml @@ -0,0 +1,7 @@ +@startuml +enum EncryptionScheme { + SodiumSymmetricAEAD, + SodiumAsymmetricPublicKeyBox, + BouncyCastleCMS, +} +@enduml diff --git a/puml-files/ENUM/Energierichtung.puml b/puml-files/ENUM/Energierichtung.puml new file mode 100644 index 00000000..9f9c39cb --- /dev/null +++ b/puml-files/ENUM/Energierichtung.puml @@ -0,0 +1,6 @@ +@startuml +enum Energierichtung { + AUSSP, + EINSP, +} +@enduml diff --git a/puml-files/ENUM/Erzeugungsart.puml b/puml-files/ENUM/Erzeugungsart.puml new file mode 100644 index 00000000..230b15a7 --- /dev/null +++ b/puml-files/ENUM/Erzeugungsart.puml @@ -0,0 +1,15 @@ +@startuml +enum Erzeugungsart { + KWK, + WIND, + SOLAR, + KERNKRAFT, + WASSER, + GEOTHERMIE, + BIOMASSE, + KOHLE, + GAS, + SONSTIGE, + SONSTIGE_EEG, +} +@enduml diff --git a/puml-files/ENUM/Fernschaltung.puml b/puml-files/ENUM/Fernschaltung.puml new file mode 100644 index 00000000..10f8fe6b --- /dev/null +++ b/puml-files/ENUM/Fernschaltung.puml @@ -0,0 +1,6 @@ +@startuml +enum Fernschaltung { + VORHANDEN, + NICHT_VORHANDEN, +} +@enduml diff --git a/puml-files/ENUM/Gasqualitaet.puml b/puml-files/ENUM/Gasqualitaet.puml new file mode 100644 index 00000000..b6418c6f --- /dev/null +++ b/puml-files/ENUM/Gasqualitaet.puml @@ -0,0 +1,8 @@ +@startuml +enum Gasqualitaet { + H_GAS= 1, + L_GAS= 2, + HGAS= 1, + LGAS= 2, +} +@enduml diff --git a/puml-files/ENUM/Gebiettyp.puml b/puml-files/ENUM/Gebiettyp.puml new file mode 100644 index 00000000..d303a4a3 --- /dev/null +++ b/puml-files/ENUM/Gebiettyp.puml @@ -0,0 +1,13 @@ +@startuml +enum Gebiettyp { + REGELZONE, + MARKTGEBIET, + BILANZIERUNGSGEBIET, + VERTEILNETZ, + TRANSPORTNETZ, + REGIONALNETZ, + AREALNETZ, + GRUNDVERSORGUNGSGEBIET, + VERSORGUNGSGEBIET, +} +@enduml diff --git a/puml-files/ENUM/Geraetemerkmal.puml b/puml-files/ENUM/Geraetemerkmal.puml new file mode 100644 index 00000000..5ad3cf54 --- /dev/null +++ b/puml-files/ENUM/Geraetemerkmal.puml @@ -0,0 +1,42 @@ +@startuml +enum Geraetemerkmal { + EINTARIF, + ZWEITARIF, + MEHRTARIF, + GAS_G2_5, + GAS_G4, + GAS_G6, + GAS_G10, + GAS_G16, + GAS_G25, + GAS_G40, + GAS_G65, + GAS_G100, + GAS_G160, + GAS_G250, + GAS_G400, + GAS_G650, + GAS_G1000, + GAS_G1600, + GAS_G2500, + IMPULSGEBER_G4_G100, + IMPULSGEBER_G100, + MODEM_GSM, + MODEM_GPRS, + MODEM_FUNK, + MODEM_GSM_O_LG, + MODEM_GSM_M_LG, + MODEM_FESTNETZ, + MODEM_GPRS_M_LG, + PLC_COM, + ETHERNET_KOM, + DSL_KOM, + LTE_KOM, + RUNDSTEUEREMPFAENGER, + TARIFSCHALTGERAET, + ZUSTANDS_MU, + TEMPERATUR_MU, + KOMPAKT_MU, + SYSTEM_MU, +} +@enduml diff --git a/puml-files/ENUM/Geraetetyp.puml b/puml-files/ENUM/Geraetetyp.puml new file mode 100644 index 00000000..bf2d5e2f --- /dev/null +++ b/puml-files/ENUM/Geraetetyp.puml @@ -0,0 +1,47 @@ +@startuml +enum Geraetetyp { + WECHSELSTROMZAEHLER, + DREHSTROMZAEHLER, + ZWEIRICHTUNGSZAEHLER, + RLM_ZAEHLER, + IMS_ZAEHLER, + BALGENGASZAEHLER, + MAXIMUMZAEHLER, + MULTIPLEXANLAGE, + PAUSCHALANLAGE, + VERSTAERKERANLAGE, + SUMMATIONSGERAET, + IMPULSGEBER, + EDL_21_ZAEHLERAUFSATZ, + VIER_QUADRANTEN_LASTGANGZAEHLER, + MENGENUMWERTER, + STROMWANDLER, + SPANNUNGSWANDLER, + DATENLOGGER, + KOMMUNIKATIONSANSCHLUSS, + MODEM, + TELEKOMMUNIKATIONSEINRICHTUNG, + DREHKOLBENGASZAEHLER, + TURBINENRADGASZAEHLER, + ULTRASCHALLZAEHLER, + WIRBELGASZAEHLER, + MODERNE_MESSEINRICHTUNG, + ELEKTRONISCHER_HAUSHALTSZAEHLER, + STEUEREINRICHTUNG, + TECHNISCHESTEUEREINRICHTUNG, + TARIFSCHALTGERAET, + RUNDSTEUEREMPFAENGER, + OPTIONALE_ZUS_ZAEHLEINRICHTUNG, + MESSWANDLERSATZ_IMS_MME, + KOMBIMESSWANDLER_IMS_MME, + TARIFSCHALTGERAET_IMS_MME, + RUNDSTEUEREMPFAENGER_IMS_MME, + TEMPERATUR_KOMPENSATION, + HOECHSTBELASTUNGS_ANZEIGER, + SONSTIGES_GERAET, + SMARTMETERGATEWAY, + STEUERBOX, + BLOCKSTROMWANDLER, + KOMBIMESSWANDLER, +} +@enduml diff --git a/puml-files/ENUM/Geschaeftspartnerrolle.puml b/puml-files/ENUM/Geschaeftspartnerrolle.puml new file mode 100644 index 00000000..b280ed65 --- /dev/null +++ b/puml-files/ENUM/Geschaeftspartnerrolle.puml @@ -0,0 +1,9 @@ +@startuml +enum Geschaeftspartnerrolle { + LIEFERANT, + DIENSTLEISTER, + KUNDE, + INTERESSENT, + MARKTPARTNER, +} +@enduml diff --git a/puml-files/ENUM/Gueltigkeitstyp.puml b/puml-files/ENUM/Gueltigkeitstyp.puml new file mode 100644 index 00000000..70cedf86 --- /dev/null +++ b/puml-files/ENUM/Gueltigkeitstyp.puml @@ -0,0 +1,5 @@ +@startuml +enum Gueltigkeitstyp { + NICHT_IN, +} +@enduml diff --git a/puml-files/ENUM/Kalkulationsmethode.puml b/puml-files/ENUM/Kalkulationsmethode.puml new file mode 100644 index 00000000..73d1e8e2 --- /dev/null +++ b/puml-files/ENUM/Kalkulationsmethode.puml @@ -0,0 +1,20 @@ +@startuml +enum Kalkulationsmethode { + KEINE, + STAFFELN, + ZONEN, + VORZONEN_GP, + SIGMOID, + BLINDARBEIT_GT_50_PROZENT, + BLINDARBEIT_GT_40_PROZENT, + AP_GP_ZONEN, + LP_INSTALL_LEISTUNG, + AP_TRANSPORT_ODER_VERTEILNETZ, + AP_TRANSPORT_ODER_VERTEILNETZ_ORTSVERTEILNETZ_SIGMOID, + LP_JAHRESVERBRAUCH, + LP_TRANSPORT_ODER_VERTEILNETZ, + LP_TRANSPORT_ODER_VERTEILNETZ_ORTSVERTEILNETZ_SIGMOID, + FUNKTIONEN, + VERBRAUCH_UEBER_SLP_GRENZE_FUNKTIONSBEZOGEN_WEITERE_BERECHNUNG_ALS_LGK, +} +@enduml diff --git a/puml-files/ENUM/Kontaktart.puml b/puml-files/ENUM/Kontaktart.puml new file mode 100644 index 00000000..65e75141 --- /dev/null +++ b/puml-files/ENUM/Kontaktart.puml @@ -0,0 +1,9 @@ +@startuml +enum Kontaktart { + ANSCHREIBEN, + TELEFONAT, + FAX, + E_MAIL, + SMS, +} +@enduml diff --git a/puml-files/ENUM/Kostenklasse.puml b/puml-files/ENUM/Kostenklasse.puml new file mode 100644 index 00000000..86811ce2 --- /dev/null +++ b/puml-files/ENUM/Kostenklasse.puml @@ -0,0 +1,4 @@ +@startuml +enum Kostenklasse { +} +@enduml diff --git a/puml-files/ENUM/Kundengruppe.puml b/puml-files/ENUM/Kundengruppe.puml new file mode 100644 index 00000000..474ce6c4 --- /dev/null +++ b/puml-files/ENUM/Kundengruppe.puml @@ -0,0 +1,34 @@ +@startuml +enum Kundengruppe { + RLM, + SLP_S_G0, + SLP_S_G1, + SLP_S_G2, + SLP_S_G3, + SLP_S_G4, + SLP_S_G5, + SLP_S_G6, + SLP_S_G7, + SLP_S_L0, + SLP_S_L1, + SLP_S_L2, + SLP_S_H0, + SLP_S_SB, + SLP_S_HZ, + SLP_S_WP, + SLP_G_GKO, + SLP_G_GHA, + SLP_G_GMK, + SLP_G_GBD, + SLP_G_GGA, + SLP_G_GBH, + SLP_G_GBA, + SLP_G_GWA, + SLP_G_GGB, + SLP_G_GPD, + SLP_G_GMF, + SLP_G_HEF, + SLP_G_HMF, + SLP_G_HKO, +} +@enduml diff --git a/puml-files/ENUM/KundengruppeKA.puml b/puml-files/ENUM/KundengruppeKA.puml new file mode 100644 index 00000000..b54132c8 --- /dev/null +++ b/puml-files/ENUM/KundengruppeKA.puml @@ -0,0 +1,23 @@ +@startuml +enum KundengruppeKA { + S_TARIF_25000, + S_TARIF_100000, + S_TARIF_500000, + S_TARIF_G_500000, + S_SONDERKUNDE, + G_KOWA_25000, + G_KOWA_100000, + G_KOWA_500000, + G_KOWA_G_500000, + G_TARIF_25000, + G_TARIF_100000, + G_TARIF_500000, + G_TARIF_G_500000, + G_SONDERKUNDE, + SONDER_KAS, + SONDER_SAS, + SONDER_TAS, + SONDER_TKS, + SONDER_TSS, +} +@enduml diff --git a/puml-files/ENUM/Kundentyp.puml b/puml-files/ENUM/Kundentyp.puml new file mode 100644 index 00000000..44ddd8f9 --- /dev/null +++ b/puml-files/ENUM/Kundentyp.puml @@ -0,0 +1,18 @@ +@startuml +enum Kundentyp { + PRIVAT, + LANDWIRT, + SONSTIGE, + HAUSHALT, + DIREKTHEIZUNG, + GEMEINSCHAFT_MFH, + KIRCHE, + KWK, + LADESAEULE, + BELEUCHTUNG_OEFFENTLICH, + BELEUCHTUNG_STRASSE, + SPEICHERHEIZUNG, + UNTERBR_EINRICHTUNG, + WAERMEPUMPE, +} +@enduml diff --git a/puml-files/ENUM/Landescode.puml b/puml-files/ENUM/Landescode.puml new file mode 100644 index 00000000..10206faf --- /dev/null +++ b/puml-files/ENUM/Landescode.puml @@ -0,0 +1,271 @@ +@startuml +enum Landescode { + AC, + AD, + AE, + AF, + AG, + AI, + AL, + AM, + AN, + AO, + AQ, + AR, + AS, + AT, + AU, + AW, + AX, + AZ, + BA, + BB, + BD, + BE, + BF, + BG, + BH, + BI, + BJ, + BL, + BM, + BN, + BO, + BQ, + BR, + BS, + BT, + BU, + BV, + BW, + BY, + BZ, + CA, + CC, + CD, + CF, + CG, + CH, + CI, + CK, + CL, + CM, + CN, + CO, + CP, + CR, + CS, + CU, + CV, + CW, + CX, + CY, + CZ, + DE, + DG, + DJ, + DK, + DM, + DO, + DZ, + EA, + EC, + EE, + EG, + EH, + ER, + ES, + ET, + EU, + FI, + FJ, + FK, + FM, + FO, + FR, + FX, + GA, + GB, + GD, + GE, + GF, + GG, + GH, + GI, + GL, + GM, + GN, + GP, + GQ, + GR, + GS, + GT, + GU, + GW, + GY, + HK, + HM, + HN, + HR, + HT, + HU, + IC, + ID, + IE, + IL, + IM, + IN, + IO, + IQ, + IR, + IS, + IT, + JE, + JM, + JO, + JP, + KE, + KG, + KH, + KI, + KM, + KN, + KP, + KR, + KW, + KY, + KZ, + LA, + LB, + LC, + LI, + LK, + LR, + LS, + LT, + LU, + LV, + LY, + MA, + MC, + MD, + ME, + MF, + MG, + MH, + MK, + ML, + MM, + MN, + MO, + MP, + MQ, + MR, + MS, + MT, + MU, + MV, + MW, + MX, + MY, + MZ, + NA, + NC, + NE, + NF, + NG, + NI, + NL, + NO, + NP, + NR, + NT, + NU, + NZ, + OM, + PA, + PE, + PF, + PG, + PH, + PK, + PL, + PM, + PN, + PR, + PS, + PT, + PW, + PY, + QA, + RE, + RO, + RS, + RU, + RW, + SA, + SB, + SC, + SD, + SE, + SF, + SG, + SH, + SI, + SJ, + SK, + SL, + SM, + SN, + SO, + SR, + SS, + ST, + SU, + SV, + SX, + SY, + SZ, + TA, + TC, + TD, + TF, + TG, + TJ, + TK, + TL, + TM, + TN, + TO, + TP, + TR, + TT, + TV, + TW, + TZ, + UA, + UG, + UK, + UM, + US, + UY, + UZ, + VA, + VC, + VE, + VG, + VI, + VN, + VU, + WF, + WS, + XK, + YE, + YT, + YU, + ZA, + ZM, + ZR, + ZW, +} +@enduml diff --git a/puml-files/ENUM/Leistungstyp.puml b/puml-files/ENUM/Leistungstyp.puml new file mode 100644 index 00000000..95d91edd --- /dev/null +++ b/puml-files/ENUM/Leistungstyp.puml @@ -0,0 +1,27 @@ +@startuml +enum Leistungstyp { + ARBEITSPREIS_WIRKARBEIT, + LEISTUNGSPREIS_WIRKLEISTUNG, + ARBEITSPREIS_BLINDARBEIT_IND, + ARBEITSPREIS_BLINDARBEIT_KAP, + GRUNDPREIS, + MEHRMINDERMENGE, + MESSSTELLENBETRIEB, + MESSDIENSTLEISTUNG, + MESSDIENSTLEISTUNG_INKL_MESSUNG, + ABRECHNUNG, + KONZESSIONS_ABGABE, + KWK_UMLAGE, + OFFSHORE_UMLAGE, + ABLAV_UMLAGE, + REGELENERGIE_UMLAGE, + BILANZIERUNG_UMLAGE, + AUSLESUNG_ZUSAETZLICH, + ABLESUNG_ZUSAETZLICH, + ABRECHNUNG_ZUSAETZLICH, + SPERRUNG, + ENTSPERRUNG, + MAHNKOSTEN, + INKASSOKOSTEN, +} +@enduml diff --git a/puml-files/ENUM/Lokationstyp.puml b/puml-files/ENUM/Lokationstyp.puml new file mode 100644 index 00000000..b489458b --- /dev/null +++ b/puml-files/ENUM/Lokationstyp.puml @@ -0,0 +1,6 @@ +@startuml +enum Lokationstyp { + MaLo, + MeLo, +} +@enduml diff --git a/puml-files/ENUM/Marktrolle.puml b/puml-files/ENUM/Marktrolle.puml new file mode 100644 index 00000000..09ac6494 --- /dev/null +++ b/puml-files/ENUM/Marktrolle.puml @@ -0,0 +1,18 @@ +@startuml +enum Marktrolle { + NB, + LF, + MSB, + MDL, + DL, + BKV, + BIKO, + UENB, + KUNDE_SELBST_NN, + MGV, + EIV, + RB, + KUNDE, + INTERESSENT, +} +@enduml diff --git a/puml-files/ENUM/Mengeneinheit.puml b/puml-files/ENUM/Mengeneinheit.puml new file mode 100644 index 00000000..50160250 --- /dev/null +++ b/puml-files/ENUM/Mengeneinheit.puml @@ -0,0 +1,19 @@ +@startuml +enum Mengeneinheit { + WH= 2, + KW= 3, + KWH= 1000 * WH, + MW= 1000 * KW, + MWH= 1000 * KWH, + ANZAHL= 7, + KUBIKMETER= 11, + STUNDE= 13, + TAG= 17, + MONAT= 19, + JAHR= 12 * MONAT, + VAR= 23, + KVAR= 1000 * VAR, + VARH= 29, + KVARH= 1000 * VARH, +} +@enduml diff --git a/puml-files/ENUM/Mengenoperator.puml b/puml-files/ENUM/Mengenoperator.puml new file mode 100644 index 00000000..26a8daaa --- /dev/null +++ b/puml-files/ENUM/Mengenoperator.puml @@ -0,0 +1,7 @@ +@startuml +enum Mengenoperator { + KLEINER_ALS, + GROESSER_ALS, + GLEICH, +} +@enduml diff --git a/puml-files/ENUM/Messpreistyp.puml b/puml-files/ENUM/Messpreistyp.puml new file mode 100644 index 00000000..6cff18b4 --- /dev/null +++ b/puml-files/ENUM/Messpreistyp.puml @@ -0,0 +1,27 @@ +@startuml +enum Messpreistyp { + MESSPREIS_G4, + MESSPREIS_G6, + MESSPREIS_G10, + MESSPREIS_G16, + MESSPREIS_G25, + MESSPREIS_G40, + ELEKTRONISCHER_AUFSATZ, + SMART_METER_MESSPREIS_G2_5, + SMART_METER_MESSPREIS_G4, + SMART_METER_MESSPREIS_G6, + SMART_METER_MESSPREIS_G10, + SMART_METER_MESSPREIS_G16, + SMART_METER_MESSPREIS_G25, + SMART_METER_MESSPREIS_G40, + VERRECHNUNGSPREIS_ET_WECHSEL, + VERRECHNUNGSPREIS_ET_DREH, + VERRECHNUNGSPREIS_ZT_WECHSEL, + VERRECHNUNGSPREIS_ZT_DREH, + VERRECHNUNGSPREIS_L_ET, + VERRECHNUNGSPREIS_L_ZT, + VERRECHNUNGSPREIS_SM, + AUFSCHLAG_WANDLER, + AUFSCHLAG_TARIFSCHALTUNG, +} +@enduml diff --git a/puml-files/ENUM/Messwerterfassung.puml b/puml-files/ENUM/Messwerterfassung.puml new file mode 100644 index 00000000..e9ab6914 --- /dev/null +++ b/puml-files/ENUM/Messwerterfassung.puml @@ -0,0 +1,6 @@ +@startuml +enum Messwerterfassung { + FERNAUSLESBAR, + MANUELL_AUSGELESENE, +} +@enduml diff --git a/puml-files/ENUM/NNRechnungsart.puml b/puml-files/ENUM/NNRechnungsart.puml new file mode 100644 index 00000000..3871752c --- /dev/null +++ b/puml-files/ENUM/NNRechnungsart.puml @@ -0,0 +1,5 @@ +@startuml +enum NNRechnungsart { + SELBSTAUSGESTELLT, +} +@enduml diff --git a/puml-files/ENUM/NNRechnungstyp.puml b/puml-files/ENUM/NNRechnungstyp.puml new file mode 100644 index 00000000..e24e5b2b --- /dev/null +++ b/puml-files/ENUM/NNRechnungstyp.puml @@ -0,0 +1,12 @@ +@startuml +enum NNRechnungstyp { + ABSCHLAGSRECHNUNG, + TURNUSRECHNUNG, + MONATSRECHNUNG, + WIMRECHNUNG, + ZWISCHENRECHNUNG, + INTEGRIERTE_13TE_RECHNUNG, + _13TE_RECHNUNG, + MEHRMINDERMENGENRECHNUNG, +} +@enduml diff --git a/puml-files/ENUM/Netzebene.puml b/puml-files/ENUM/Netzebene.puml new file mode 100644 index 00000000..d5f82e46 --- /dev/null +++ b/puml-files/ENUM/Netzebene.puml @@ -0,0 +1,14 @@ +@startuml +enum Netzebene { + NSP, + MSP, + HSP, + HSS, + MSP_NSP_UMSP, + HSP_MSP_UMSP, + HSS_HSP_UMSP, + HD, + MD, + ND, +} +@enduml diff --git a/puml-files/ENUM/Netznutzungsabrechnungsgrundlage.puml b/puml-files/ENUM/Netznutzungsabrechnungsgrundlage.puml new file mode 100644 index 00000000..2d821998 --- /dev/null +++ b/puml-files/ENUM/Netznutzungsabrechnungsgrundlage.puml @@ -0,0 +1,6 @@ +@startuml +enum Netznutzungsabrechnungsgrundlage { + LIEFERSCHEIN, + ABWEICHENDE_GRUNDLAGE, +} +@enduml diff --git a/puml-files/ENUM/Netznutzungsabrechnungsvariante.puml b/puml-files/ENUM/Netznutzungsabrechnungsvariante.puml new file mode 100644 index 00000000..13163170 --- /dev/null +++ b/puml-files/ENUM/Netznutzungsabrechnungsvariante.puml @@ -0,0 +1,6 @@ +@startuml +enum Netznutzungsabrechnungsvariante { + ARBEITSPREIS_GRUNDPREIS, + ARBEITSPREIS_LEISTUNGSPREIS, +} +@enduml diff --git a/puml-files/ENUM/Netznutzungsvertrag.puml b/puml-files/ENUM/Netznutzungsvertrag.puml new file mode 100644 index 00000000..6f8f6378 --- /dev/null +++ b/puml-files/ENUM/Netznutzungsvertrag.puml @@ -0,0 +1,6 @@ +@startuml +enum NetznutzungsVertrag { + KUNDEN_NB, + LIEFERANTEN_NB, +} +@enduml diff --git a/puml-files/ENUM/Netznutzungszahler.puml b/puml-files/ENUM/Netznutzungszahler.puml new file mode 100644 index 00000000..6d549fa8 --- /dev/null +++ b/puml-files/ENUM/Netznutzungszahler.puml @@ -0,0 +1,6 @@ +@startuml +enum Netznutzungszahler { + KUNDE, + LIEFERANT, +} +@enduml diff --git a/puml-files/ENUM/Oekolabel.puml b/puml-files/ENUM/Oekolabel.puml new file mode 100644 index 00000000..0f95ea7f --- /dev/null +++ b/puml-files/ENUM/Oekolabel.puml @@ -0,0 +1,15 @@ +@startuml +enum Oekolabel { + GASGREEN_GRUENER_STROM, + GASGREEN, + GRUENER_STROM_GOLD, + GRUENER_STROM_SILBER, + GRUENER_STROM, + GRUENES_GAS, + NATURWATT_STROM, + OK_POWER, + RENEWABLE_PLUS, + WATERGREEN, + WATERGREEN_PLUS, +} +@enduml diff --git a/puml-files/ENUM/Oekozertifikat.puml b/puml-files/ENUM/Oekozertifikat.puml new file mode 100644 index 00000000..e7d6b947 --- /dev/null +++ b/puml-files/ENUM/Oekozertifikat.puml @@ -0,0 +1,20 @@ +@startuml +enum Oekozertifikat { + CMS_EE02, + EECS, + FRAUNHOFER, + BET, + KLIMA_INVEST, + LGA, + FREIBERG, + RECS, + REGS_EGL, + TUEV, + TUEV_HESSEN, + TUEV_NORD, + TUEV_RHEINLAND, + TUEV_SUED, + TUEV_SUED_EE01, + TUEV_SUED_EE02, +} +@enduml diff --git a/puml-files/ENUM/Preisgarantietyp.puml b/puml-files/ENUM/Preisgarantietyp.puml new file mode 100644 index 00000000..1262d2c8 --- /dev/null +++ b/puml-files/ENUM/Preisgarantietyp.puml @@ -0,0 +1,7 @@ +@startuml +enum Preisgarantietyp { + ALLE_PREISBESTANDTEILE_NETTO, + PREISBESTANDTEILE_OHNE_ABGABEN, + NUR_ENERGIEPREIS, +} +@enduml diff --git a/puml-files/ENUM/Preismodell.puml b/puml-files/ENUM/Preismodell.puml new file mode 100644 index 00000000..9bba0079 --- /dev/null +++ b/puml-files/ENUM/Preismodell.puml @@ -0,0 +1,5 @@ +@startuml +enum Preismodell { + TRANCHE, +} +@enduml diff --git a/puml-files/ENUM/Preisstatus.puml b/puml-files/ENUM/Preisstatus.puml new file mode 100644 index 00000000..d4c3b931 --- /dev/null +++ b/puml-files/ENUM/Preisstatus.puml @@ -0,0 +1,6 @@ +@startuml +enum Preisstatus { + VORLAEUFIG, + ENDGUELTIG, +} +@enduml diff --git a/puml-files/ENUM/Preistyp.puml b/puml-files/ENUM/Preistyp.puml new file mode 100644 index 00000000..127d9957 --- /dev/null +++ b/puml-files/ENUM/Preistyp.puml @@ -0,0 +1,13 @@ +@startuml +enum Preistyp { + ARBEITSPREIS_EINTARIF, + ARBEITSPREIS_HT, + ARBEITSPREIS_NT, + LEISTUNGSPREIS, + MESSPREIS, + ENTGELT_ABLESUNG, + ENTGELT_ABRECHNUNG, + ENTGELT_MSB, + PROVISION, +} +@enduml diff --git a/puml-files/ENUM/Prioritaet.puml b/puml-files/ENUM/Prioritaet.puml new file mode 100644 index 00000000..63032233 --- /dev/null +++ b/puml-files/ENUM/Prioritaet.puml @@ -0,0 +1,9 @@ +@startuml +enum Prioritaet { + SEHR_NIEDRIG, + NIEDRIG, + NORMAL, + HOCH, + SEHR_HOCH, +} +@enduml diff --git a/puml-files/ENUM/Rechnungslegung.puml b/puml-files/ENUM/Rechnungslegung.puml new file mode 100644 index 00000000..4907c2fc --- /dev/null +++ b/puml-files/ENUM/Rechnungslegung.puml @@ -0,0 +1,9 @@ +@startuml +enum Rechnungslegung { + MONATSRECHN, + ABSCHL_MONATSRECHN, + ABSCHL_JAHRESRECHN, + MONATSRECHN_JAHRESRECHN, + VORKASSE, +} +@enduml diff --git a/puml-files/ENUM/RechnungspositionsStatus.puml b/puml-files/ENUM/RechnungspositionsStatus.puml new file mode 100644 index 00000000..8007cf70 --- /dev/null +++ b/puml-files/ENUM/RechnungspositionsStatus.puml @@ -0,0 +1,9 @@ +@startuml +enum RechnungspositionsStatus { + ROH= 0, + ROH_AUSGENOMMEN= 1, + ABRECHENBAR= 2, + ABRECHENBAR_AUSGENOMMEN= 3, + ABGERECHNET= 4, +} +@enduml diff --git a/puml-files/ENUM/Rechnungsstatus.puml b/puml-files/ENUM/Rechnungsstatus.puml new file mode 100644 index 00000000..9273ff4f --- /dev/null +++ b/puml-files/ENUM/Rechnungsstatus.puml @@ -0,0 +1,8 @@ +@startuml +enum Rechnungsstatus { + GEPRUEFT_OK, + GEPRUEFT_FEHLERHAFT, + GEBUCHT, + BEZAHLT, +} +@enduml diff --git a/puml-files/ENUM/Rechnungstyp.puml b/puml-files/ENUM/Rechnungstyp.puml new file mode 100644 index 00000000..c2bbe7ee --- /dev/null +++ b/puml-files/ENUM/Rechnungstyp.puml @@ -0,0 +1,12 @@ +@startuml +enum Rechnungstyp { + ABSCHLAGSRECHNUNG, + TURNUSRECHNUNG, + MONATSRECHNUNG, + WIMRECHNUNG, + ZWISCHENRECHNUNG, + INTEGRIERTE_13TE_RECHNUNG, + ZUSAETZLICHE_13TE_RECHNUNG, + MEHRMINDERMENGENRECHNUNG, +} +@enduml diff --git a/puml-files/ENUM/Regionskriteriumtyp.puml b/puml-files/ENUM/Regionskriteriumtyp.puml new file mode 100644 index 00000000..4d2bb1ec --- /dev/null +++ b/puml-files/ENUM/Regionskriteriumtyp.puml @@ -0,0 +1,29 @@ +@startuml +enum Regionskriteriumtyp { + BUNDESLANDKENNZIFFER, + BUNDESLAND_NAME, + MARKTGEBIET_NUMMER, + MARKTGEBIET_NAME, + REGELGEBIET_NUMMER, + REGELGEBIET_NAME, + NETZBETREIBER_NUMMER, + NETZBETREIBER_NAME, + BILANZIERUNGS_GEBIET_NUMMER, + MSB_NUMMER, + MSB_NAME, + VERSORGER_NUMMER, + VERSORGER_NAME, + GRUNDVERSORGER_NUMMER, + GRUNDVERSORGER_NAME, + KREIS_NAME, + KREISKENNZIFFER, + GEMEINDE_NAME, + GEMEINDEKENNZIFFER, + POSTLEITZAHL, + ORT, + EINWOHNERZAHL_GEMEINDE, + EINWOHNERZAHL_ORT, + KM_UMKREIS, + BUNDESWEIT, +} +@enduml diff --git a/puml-files/ENUM/Rollencodetyp.puml b/puml-files/ENUM/Rollencodetyp.puml new file mode 100644 index 00000000..ebd79407 --- /dev/null +++ b/puml-files/ENUM/Rollencodetyp.puml @@ -0,0 +1,7 @@ +@startuml +enum Rollencodetyp { + BDEW, + DVGW, + GLN, +} +@enduml diff --git a/puml-files/ENUM/Rufnummernart.puml b/puml-files/ENUM/Rufnummernart.puml new file mode 100644 index 00000000..e701c94b --- /dev/null +++ b/puml-files/ENUM/Rufnummernart.puml @@ -0,0 +1,13 @@ +@startuml +enum Rufnummernart { + RUF_ZENTRALE, + FAX_ZENTRALE, + SAMMELRUF, + SAMMELFAX, + ABTEILUNGRUF, + ABTEILUNGFAX, + RUF_DURCHWAHL, + FAX_DURCHWAHL, + MOBIL_NUMMER, +} +@enduml diff --git a/puml-files/ENUM/Schwachlastfaehig.puml b/puml-files/ENUM/Schwachlastfaehig.puml new file mode 100644 index 00000000..7e1930e2 --- /dev/null +++ b/puml-files/ENUM/Schwachlastfaehig.puml @@ -0,0 +1,6 @@ +@startuml +enum Schwachlastfaehig { + NICHT_SCHWACHLASTFAEHIG, + SCHWACHLASTFAEHIG, +} +@enduml diff --git a/puml-files/ENUM/Servicetyp.puml b/puml-files/ENUM/Servicetyp.puml new file mode 100644 index 00000000..22b8ad45 --- /dev/null +++ b/puml-files/ENUM/Servicetyp.puml @@ -0,0 +1,10 @@ +@startuml +enum Servicetyp { + STROM_NB, + STROM_MSB, + STROM_LIEF, + GAS_NB, + GAS_MSB, + GAS_LIEF, +} +@enduml diff --git a/puml-files/ENUM/Sparte.puml b/puml-files/ENUM/Sparte.puml new file mode 100644 index 00000000..2981c8ba --- /dev/null +++ b/puml-files/ENUM/Sparte.puml @@ -0,0 +1,10 @@ +@startuml +enum Sparte { + STROM, + GAS, + FERNWAERME, + NAHWAERME, + WASSER, + ABWASSER, +} +@enduml diff --git a/puml-files/ENUM/Steuerkennzeichen.puml b/puml-files/ENUM/Steuerkennzeichen.puml new file mode 100644 index 00000000..78ce0404 --- /dev/null +++ b/puml-files/ENUM/Steuerkennzeichen.puml @@ -0,0 +1,10 @@ +@startuml +enum Steuerkennzeichen { + UST_19, + UST_7, + VST_0, + VST_19, + VST_7, + RCV, +} +@enduml diff --git a/puml-files/ENUM/Tarifart.puml b/puml-files/ENUM/Tarifart.puml new file mode 100644 index 00000000..66d438a5 --- /dev/null +++ b/puml-files/ENUM/Tarifart.puml @@ -0,0 +1,9 @@ +@startuml +enum Tarifart { + EINTARIF, + ZWEITARIF, + MEHRTARIF, + SMART_METER, + LEISTUNGSGEMESSEN, +} +@enduml diff --git a/puml-files/ENUM/Tarifkalkulationsmethode.puml b/puml-files/ENUM/Tarifkalkulationsmethode.puml new file mode 100644 index 00000000..a43e8bce --- /dev/null +++ b/puml-files/ENUM/Tarifkalkulationsmethode.puml @@ -0,0 +1,8 @@ +@startuml +enum Tarifkalkulationsmethode { + STAFFELN, + ZONEN, + BESTABRECHNUNG_STAFFEL, + PAKETPREIS, +} +@enduml diff --git a/puml-files/ENUM/Tarifmerkmal.puml b/puml-files/ENUM/Tarifmerkmal.puml new file mode 100644 index 00000000..7fc5c54f --- /dev/null +++ b/puml-files/ENUM/Tarifmerkmal.puml @@ -0,0 +1,11 @@ +@startuml +enum Tarifmerkmal { + VORKASSE, + PAKET, + KOMBI, + FESTPREIS, + BAUSTROM, + HAUSLICHT, + HEIZSTROM, +} +@enduml diff --git a/puml-files/ENUM/Tarifregionskriterium.puml b/puml-files/ENUM/Tarifregionskriterium.puml new file mode 100644 index 00000000..e247b944 --- /dev/null +++ b/puml-files/ENUM/Tarifregionskriterium.puml @@ -0,0 +1,8 @@ +@startuml +enum Tarifregionskriterium { + NETZ_NUMMER, + POSTLEITZAHL, + ORT, + GRUNDVERSORGER_NUMMER, +} +@enduml diff --git a/puml-files/ENUM/Tariftyp.puml b/puml-files/ENUM/Tariftyp.puml new file mode 100644 index 00000000..791c7f57 --- /dev/null +++ b/puml-files/ENUM/Tariftyp.puml @@ -0,0 +1,8 @@ +@startuml +enum Tariftyp { + GRUND_ERSATZVERSORGUNG, + GRUNDVERSORGUNG, + ERSATZVERSORGUNG, + SONDERTARIF, +} +@enduml diff --git a/puml-files/ENUM/Tarifzeit.puml b/puml-files/ENUM/Tarifzeit.puml new file mode 100644 index 00000000..639dff67 --- /dev/null +++ b/puml-files/ENUM/Tarifzeit.puml @@ -0,0 +1,7 @@ +@startuml +enum Tarifzeit { + TZ_STANDARD, + TZ_HT, + TZ_NT, +} +@enduml diff --git a/puml-files/ENUM/Themengebiet.puml b/puml-files/ENUM/Themengebiet.puml new file mode 100644 index 00000000..def61166 --- /dev/null +++ b/puml-files/ENUM/Themengebiet.puml @@ -0,0 +1,63 @@ +@startuml +enum Themengebiet { + ALLGEMEINER_INFORMATIONSAUSTAUSCH, + AN_UND_ABMELDUNG, + ANSPRECHPARTNER_ALLGEMEIN, + ANSPRECHPARTNER_BDEW_DVGW, + ANSPRECHPARTNER_IT_TECHNIK, + BILANZIERUNG, + BILANZKREISKOORDINATOR, + BILANZKREISVERANTWORTLICHER, + DATENFORMATE_ZERTIFIKATE_VERSCHLUESSELUNGEN, + DEBITORENMANAGEMENT, + DEMAND_SIDE_MANAGEMENT, + EDI_VEREINBARUNG, + EDIFACT, + ENERGIEDATENMANAGEMENT, + FAHRPLANMANAGEMENT, + ALOCAT, + APERAK, + CONTRL, + INVOIC, + MSCONS, + ORDERS, + ORDERSP, + REMADV, + UTILMD, + GABI, + GELI, + GERAETERUECKGABE, + GERAETEWECHSEL, + GPKE, + INBETRIEBNAHME, + KAPAZITAETSMANAGEMENT, + KLAERFAELLE, + LASTGAENGE_RLM, + LIEFERANTENRAHMENVERTRAG, + LIEFERANTENWECHSEL, + MABIS, + MAHNWESEN, + MARKTGEBIETSVERANTWORTLICHER, + MARKTKOMMUNIKATION, + MEHR_MINDERMENGEN, + MSB_MDL, + NETZABRECHNUNG, + NETZENTGELTE, + NETZMANAGEMENT, + RECHT, + REGULIERUNGSMANAGEMENT, + REKLAMATIONEN, + SPERREN_ENTSPERREN_INKASSO, + STAMMDATEN, + STOERUNGSFAELLE, + TECHNISCHE_FRAGEN, + UMSTELLUNG_INVOIC, + VERSCHLUESSELUNG_SIGNATUR, + VERTRAGSMANAGEMENT, + VERTRIEB, + WIM, + ZAEHLERSTAENDE_SLP, + ZAHLUNGSVERKEHR, + ZUORDNUNGSVEREINBARUNG, +} +@enduml diff --git a/puml-files/ENUM/Titel.puml b/puml-files/ENUM/Titel.puml new file mode 100644 index 00000000..855d2485 --- /dev/null +++ b/puml-files/ENUM/Titel.puml @@ -0,0 +1,7 @@ +@startuml +enum Titel { + DR, + PROF, + PROF_DR, +} +@enduml diff --git a/puml-files/ENUM/Unterbrechbarkeit.puml b/puml-files/ENUM/Unterbrechbarkeit.puml new file mode 100644 index 00000000..b5a752d8 --- /dev/null +++ b/puml-files/ENUM/Unterbrechbarkeit.puml @@ -0,0 +1,6 @@ +@startuml +enum Unterbrechbarkeit { + UV, + NUV, +} +@enduml diff --git a/puml-files/ENUM/Verbrauchsart.puml b/puml-files/ENUM/Verbrauchsart.puml new file mode 100644 index 00000000..fd14fef1 --- /dev/null +++ b/puml-files/ENUM/Verbrauchsart.puml @@ -0,0 +1,9 @@ +@startuml +enum Verbrauchsart { + KL, + KLW, + KLWS, + W, + WS, +} +@enduml diff --git a/puml-files/ENUM/Verbrauchsmengetyp.puml b/puml-files/ENUM/Verbrauchsmengetyp.puml new file mode 100644 index 00000000..641a6dea --- /dev/null +++ b/puml-files/ENUM/Verbrauchsmengetyp.puml @@ -0,0 +1,7 @@ +@startuml +enum Verbrauchsmengetyp { + ARBEITLEISTUNGTAGESPARAMETERABHMALO, + VERANSCHLAGTEJAHRESMENGE, + TUMKUNDENWERT, +} +@enduml diff --git a/puml-files/ENUM/Vertragsart.puml b/puml-files/ENUM/Vertragsart.puml new file mode 100644 index 00000000..406f6eae --- /dev/null +++ b/puml-files/ENUM/Vertragsart.puml @@ -0,0 +1,9 @@ +@startuml +enum Vertragsart { + ENERGIELIEFERVERTRAG, + NETZNUTZUNGSVERTRAG, + BILANZIERUNGSVERTRAG, + MESSSTELLENBETRIEBSVERTRAG, + BUENDELVERTRAG, +} +@enduml diff --git a/puml-files/ENUM/Vertragsform.puml b/puml-files/ENUM/Vertragsform.puml new file mode 100644 index 00000000..5f58b76e --- /dev/null +++ b/puml-files/ENUM/Vertragsform.puml @@ -0,0 +1,7 @@ +@startuml +enum Vertragsform { + ONLINE, + DIREKT, + FAX, +} +@enduml diff --git a/puml-files/ENUM/Vertragstatus.puml b/puml-files/ENUM/Vertragstatus.puml new file mode 100644 index 00000000..f7cc93fd --- /dev/null +++ b/puml-files/ENUM/Vertragstatus.puml @@ -0,0 +1,13 @@ +@startuml +enum Vertragstatus { + IN_ARBEIT, + UEBERMITTELT, + ANGENOMMEN, + AKTIV, + ABGELEHNT, + WIDERRUFEN, + STORNIERT, + GEKUENDIGT, + BEENDET, +} +@enduml diff --git a/puml-files/ENUM/Verwendungszweck.puml b/puml-files/ENUM/Verwendungszweck.puml new file mode 100644 index 00000000..cdd3ad8d --- /dev/null +++ b/puml-files/ENUM/Verwendungszweck.puml @@ -0,0 +1,8 @@ +@startuml +enum Verwendungszweck { + NETZNUTZUNGSABRECHNUNG, + BILANZKREISABRECHNUNG, + MEHRMINDERMBENGENABRECHNUNG, + ENDKUNDENABRECHNUNG, +} +@enduml diff --git a/puml-files/ENUM/Voraussetzungen.puml b/puml-files/ENUM/Voraussetzungen.puml new file mode 100644 index 00000000..b7dc403e --- /dev/null +++ b/puml-files/ENUM/Voraussetzungen.puml @@ -0,0 +1,43 @@ +@startuml +enum Voraussetzungen { + EINZUGSERMAECHTIGUNG, + ZEITPUNKT, + LIEFERANBINDUNG_EINE, + LIEFERANBINDUNG_ALLE, + GEWERBE, + LASTPROFIL, + ZAEHLERTYP_GROESSE, + AUSSCHLUSS_GROSSVERBRAUCHER, + NEUKUNDE, + BESTIMMTE_VERTRAGSFORMALITAETEN, + SELBSTABLESUNG, + ONLINEVORAUSSETZUNG, + MINDESTUMSATZ, + ZUSATZPRODUKT, + NEUKUNDE_MIT_VORAUSSETZUNGEN, + DIREKTVERTRIEB, + ANSCHLUSSART, + ANSCHLUSSWERT, + ALTER_KUNDENANLAGE, + ANLAGEBESCHAFFENHEIT, + BETRIEBSSTUNDENBEGRENZUNG, + FREIGABEZEITEN, + FAMILIENSTRUKTUR, + MITGLIEDSCHAFT, + STAATLICHE_FOERDERUNG, + BESONDERE_VERBRAUCHSSTELLE, + NIEDRIGENERGIE, + ORTSTEILE_LIEFERGEBIET, + WAERMEBEDARF_ERDGAS, + MAX_ZAEHLER_LIEFERSTELLEN, + LIEFERUNGSBESCHRAENKUNG_GASART, + KOMBI_BONI, + ALTVERTRAG, + VORGESCHRIEBENE_ZUSATZANLAGE, + MEHRERE_ZAEHLER_ABNAHMESTELLEN, + BESTIMMTER_ABNAHMEFALL, + ZUSATZMODALITAET, + NACHWEIS_ZAHLUNGSFAEHIGKEIT, + UMSTELLUNG_ENERGIEART, +} +@enduml diff --git a/puml-files/ENUM/Waehrungscode.puml b/puml-files/ENUM/Waehrungscode.puml new file mode 100644 index 00000000..7873cd48 --- /dev/null +++ b/puml-files/ENUM/Waehrungscode.puml @@ -0,0 +1,185 @@ +@startuml +enum Waehrungscode { + AFN, + ALL, + AMD, + ANG, + AOA, + ARS, + AUD, + AWG, + AZN, + BAM, + BBD, + BDT, + BGN, + BHD, + BIF, + BMD, + BND, + BOB, + BOV, + BRL, + BSD, + BTN, + BWP, + BYN, + BYR, + BZD, + CAD, + CDF, + CHE, + CHF, + CHW, + CLF, + CLP, + CNY, + COP, + COU, + CRC, + CUC, + CUP, + CVE, + CZK, + DJF, + DKK, + DOP, + DZD, + EGP, + ERN, + ETB, + EUR, + FJD, + FKP, + GBP, + GEL, + GHS, + GIP, + GMD, + GNF, + GTQ, + GYD, + HKD, + HNL, + HRK, + HTG, + HUF, + IDR, + ILS, + INR, + IQD, + IRR, + ISK, + JMD, + JOD, + JPY, + KES, + KGS, + KHR, + KMF, + KPW, + KRW, + KWD, + KYD, + KZT, + LAK, + LBP, + LKR, + LRD, + LSL, + LTL, + LYD, + MAD, + MDL, + MGA, + MKD, + MMK, + MNT, + MOP, + MRO, + MUR, + MVR, + MWK, + MXN, + MXV, + MYR, + MZN, + NAD, + NGN, + NIO, + NOK, + NPR, + NZD, + OMR, + PAB, + PEN, + PGK, + PHP, + PKR, + PLN, + PYG, + QAR, + RON, + RSD, + RUB, + RUR, + RWF, + SAR, + SBD, + SCR, + SDG, + SEK, + SGD, + SHP, + SLL, + SOS, + SRD, + SSP, + STD, + SVC, + SYP, + SZL, + THB, + TJS, + TMT, + TND, + TOP, + TRY, + TTD, + TWD, + TZS, + UAH, + UGX, + USD, + USN, + USS, + UYI, + UYU, + UZS, + VEF, + VND, + VUV, + WST, + XAF, + XAG, + XAU, + XBA, + XBB, + XBC, + XBD, + XCD, + XDR, + XOF, + XPD, + XPF, + XPT, + XSU, + XTS, + XUA, + XXX, + YER, + ZAR, + ZMW, + ZWL, +} +@enduml diff --git a/puml-files/ENUM/Waehrungseinheit.puml b/puml-files/ENUM/Waehrungseinheit.puml new file mode 100644 index 00000000..1797b1d0 --- /dev/null +++ b/puml-files/ENUM/Waehrungseinheit.puml @@ -0,0 +1,6 @@ +@startuml +enum Waehrungseinheit { + EUR, + CT, +} +@enduml diff --git a/puml-files/ENUM/Waermenutzung.puml b/puml-files/ENUM/Waermenutzung.puml new file mode 100644 index 00000000..ab50cc50 --- /dev/null +++ b/puml-files/ENUM/Waermenutzung.puml @@ -0,0 +1,7 @@ +@startuml +enum Waermenutzung { + SPEICHERHEIZUNG, + WAERMEPUMPE, + DIREKTHEIZUNG, +} +@enduml diff --git a/puml-files/ENUM/Wertermittlungsverfahren.puml b/puml-files/ENUM/Wertermittlungsverfahren.puml new file mode 100644 index 00000000..b4e99a9e --- /dev/null +++ b/puml-files/ENUM/Wertermittlungsverfahren.puml @@ -0,0 +1,6 @@ +@startuml +enum Wertermittlungsverfahren { + PROGNOSE, + MESSUNG, +} +@enduml diff --git a/puml-files/ENUM/Zaehlerauspraegung.puml b/puml-files/ENUM/Zaehlerauspraegung.puml new file mode 100644 index 00000000..69b8fcff --- /dev/null +++ b/puml-files/ENUM/Zaehlerauspraegung.puml @@ -0,0 +1,6 @@ +@startuml +enum Zaehlerauspraegung { + EINRICHTUNGSZAEHLER, + ZWEIRICHTUNGSZAEHLER, +} +@enduml diff --git a/puml-files/ENUM/Zaehlertyp.puml b/puml-files/ENUM/Zaehlertyp.puml new file mode 100644 index 00000000..9ee3c5c4 --- /dev/null +++ b/puml-files/ENUM/Zaehlertyp.puml @@ -0,0 +1,13 @@ +@startuml +enum Zaehlertyp { + DREHSTROMZAEHLER, + BALGENGASZAEHLER, + DREHKOLBENZAEHLER, + SMARTMETER, + LEISTUNGSZAEHLER, + MAXIMUMZAEHLER, + TURBINENRADGASZAEHLER, + ULTRASCHALLGASZAEHLER, + WECHSELSTROMZAEHLER, +} +@enduml diff --git a/puml-files/ENUM/Zeiteinheit.puml b/puml-files/ENUM/Zeiteinheit.puml new file mode 100644 index 00000000..d06c7ccb --- /dev/null +++ b/puml-files/ENUM/Zeiteinheit.puml @@ -0,0 +1,14 @@ +@startuml +enum Zeiteinheit { + SEKUNDE, + MINUTE, + STUNDE, + VIERTEL_STUNDE, + TAG, + WOCHE, + MONAT, + QUARTAL, + HALBJAHR, + JAHR, +} +@enduml diff --git a/puml-files/ENUM/Zeitreihentyp.puml b/puml-files/ENUM/Zeitreihentyp.puml new file mode 100644 index 00000000..80768267 --- /dev/null +++ b/puml-files/ENUM/Zeitreihentyp.puml @@ -0,0 +1,11 @@ +@startuml +enum Zeitreihentyp { + EGS, + LGS, + NZR, + SES, + SLS, + TES, + TLS, +} +@enduml diff --git a/puml-files/EdiBoMapper.puml b/puml-files/EdiBoMapper.puml new file mode 100644 index 00000000..14a16096 --- /dev/null +++ b/puml-files/EdiBoMapper.puml @@ -0,0 +1,6 @@ +@startuml +class EdiBoMapper { + + {static} fromEdi(objectName:string, objectValue:string) : string +} +EdiBoMapper o-> "_logger" ILogger +@enduml diff --git a/puml-files/StaticLogger.puml b/puml-files/StaticLogger.puml new file mode 100644 index 00000000..1efe63da --- /dev/null +++ b/puml-files/StaticLogger.puml @@ -0,0 +1,5 @@ +@startuml +class StaticLogger <> { +} +StaticLogger --> "Logger" ILogger +@enduml diff --git a/puml-files/UserPropertiesDataContractResolver.puml b/puml-files/UserPropertiesDataContractResolver.puml new file mode 100644 index 00000000..50bcfc91 --- /dev/null +++ b/puml-files/UserPropertiesDataContractResolver.puml @@ -0,0 +1,8 @@ +@startuml +class UserPropertiesDataContractResolver { + + UserPropertiesDataContractResolver(userPropertiesWhiteList:HashSet) + + <> ResolveContract(type:Type) : JsonContract +} +DefaultContractResolver <|-- UserPropertiesDataContractResolver +UserPropertiesDataContractResolver o-> "Instance" UserPropertiesDataContractResolver +@enduml diff --git a/puml-files/include.puml b/puml-files/include.puml new file mode 100644 index 00000000..9ac36cb1 --- /dev/null +++ b/puml-files/include.puml @@ -0,0 +1,2669 @@ +@startuml +class BoEdiMapper { + + {static} ToEdi(objectName:string, objectValue:string) : string + + {static} ReplaceWithEdiValues(o:Object) : JObject +} +BoEdiMapper o-> "_logger" ILogger +abstract class BoMapper { + + {static} <> packagePrefix : string = "BO4E.BO" + + {static} MapObject(jobject:JObject, lenient:LenientParsing) : BusinessObject + + {static} MapObject(jobject:JObject, userPropertiesWhiteList:HashSet, lenient:LenientParsing) : BusinessObject + + {static} MapObject(businessObjectName:string, jobject:JObject, lenient:LenientParsing) : BusinessObject + + {static} MapObject(businessObjectType:Type, jobject:JObject, lenient:LenientParsing) : BusinessObject + + {static} MapObject(jobject:JObject, lenient:LenientParsing) : BusinessObjectType + + {static} MapObject(businessObjectName:string, jobject:JObject, userPropertiesWhiteList:HashSet, lenient:LenientParsing) : BusinessObject + + {static} MapObject(businessObjectType:Type, jobject:JObject, userPropertiesWhiteList:HashSet, lenient:LenientParsing) : BusinessObject + + {static} MapObject(jobject:JObject, userPropertiesWhiteList:HashSet, lenient:LenientParsing) : BusinessObjectType + + {static} GetValidBoNames() : HashSet + + {static} GetTypeForBoName(businessObjectName:string) : Type + + {static} GetJsonSchemeFor(businessObjectName:string) : JSchema + + {static} GetJsonSchemeFor(businessObjectType:Type) : JSchema + + {static} GetAnnotatedFields(boName:string) : FieldInfo[] + + {static} GetAnnotatedFields(type:Type) : FieldInfo[] + + {static} GetAnnotatedFields(boType:Type, attributeType:Type) : FieldInfo[] + + {static} GetAnnotatedFields(boName:string, attributeType:Type) : FieldInfo[] +} +class EdiBoMapper { + + {static} fromEdi(objectName:string, objectValue:string) : string +} +EdiBoMapper o-> "_logger" ILogger +class StaticLogger <> { +} +StaticLogger --> "Logger" ILogger +class UserPropertiesDataContractResolver { + + UserPropertiesDataContractResolver(userPropertiesWhiteList:HashSet) + + <> ResolveContract(type:Type) : JsonContract +} +DefaultContractResolver <|-- UserPropertiesDataContractResolver +UserPropertiesDataContractResolver o-> "Instance" UserPropertiesDataContractResolver +class Angebot { + + Angebotsnummer : string <> <> + + Anfragereferenz : string <> <> + + Angebotsdatum : string <> <> +} +class "List`1" { +} +BusinessObject <|-- Angebot +Angebot --> "Sparte" Sparte +Angebot --> "Bindefrist" DateTime +Angebot --> "Angebotgeber" Geschaeftspartner +Angebot --> "Angebotnehmer" Geschaeftspartner +Angebot --> "UnterzeichnerAngebotsnehmer" Ansprechpartner +Angebot --> "UnterzeichnerAngebotsgeber" Ansprechpartner +Angebot --> "Varianten" "List`1" +class Ansprechpartner { + + Anrede : Anrede? <> <> + + IndividuelleAnrede : string <> <> + + Titel : Titel? + + Vorname : string <> <> + + Nachname : string <> <> + + EMailAdresse : string <> <> + + Kommentar : string <> <> +} +class "List`1" { +} +BusinessObject <|-- Ansprechpartner +Ansprechpartner --> "Geschaeftspartner" Geschaeftspartner +Ansprechpartner --> "Adresse" Adresse +Ansprechpartner --> "Rufnummer" "List`1" +Ansprechpartner --> "Zustaendigkeit" "List`1" +class Benachrichtigung { + + BenachrichtigungsId : string <> <> + + Kurztext : string <> <> + + Kategorie : string <> <> + + Bearbeiter : string <> <> + + Deadline : DateTime? <> <> +} +class "List`1" { +} +BusinessObject <|-- Benachrichtigung +Benachrichtigung --> "Prioritaet" Prioritaet +Benachrichtigung --> "Bearbeitungsstatus" Bearbeitungsstatus +Benachrichtigung --> "ErstellungsZeitpunkt" DateTime +Benachrichtigung --> "Notizen" "List`1" +Benachrichtigung --> "Aufgaben" "List`1" +Benachrichtigung --> "Infos" "List`1" +abstract class BusinessObject { + + BoTyp : string <> <> + + <> USER_PROPERTIES_NAME : string = "userProperties" + + GetBoTyp() : string + + versionStruktur : int + + guid : string + + GetJsonScheme() : JSchema + + {static} GetJsonSchema(boType:Type) : JSchema + + GetURI(includeUserProperties:bool) : Bo4eUri + + GetBoKeyNames() : List + + {static} GetBoKeyNames(boType:Type) : List + + {static} GetExpandablePropertyNames(boType:Type) : Dictionary + + {static} GetExpandableFieldNames(boTypeName:string) : Dictionary + + GetBoKeys() : Dictionary + + {static} GetBoKeyProps(boType:Type) : List + + <> Equals(b:object) : bool + + Equals(b:BusinessObject) : bool + + <> GetHashCode() : int + + <> IsValid() : bool +} +class "IEquatable`1" { +} +class "IDictionary`2" { +} +class BaseSpecifiedConcreteClassConverter { +} +class BusinessObjectBaseConverter { + + <> CanConvert(objectType:Type) : bool + + <> ReadJson(reader:JsonReader, objectType:Type, existingValue:object, serializer:JsonSerializer) : object + + <> CanWrite : bool <> + + <> WriteJson(writer:JsonWriter, value:object, serializer:JsonSerializer) : void +} +"IEquatable`1" "" <|-- BusinessObject +BusinessObject --> "UserProperties" "IDictionary`2" +BusinessObject +-- BaseSpecifiedConcreteClassConverter +DefaultContractResolver <|-- BaseSpecifiedConcreteClassConverter +BusinessObject +-- BusinessObjectBaseConverter +JsonConverter <|-- BusinessObjectBaseConverter +class Energiemenge { + + LokationsId : string <> <> +} +class "List`1" { +} +class "Dictionary`2" { +} +BusinessObject <|-- Energiemenge +Energiemenge --> "LokationsTyp" Lokationstyp +Energiemenge --> "Energieverbrauch" "List`1" +class Geschaeftspartner { + + anrede : Anrede? <> <> + + Title : string <> <> + + Name1 : string <> <> + + Name2 : string <> <> + + Name3 : string <> <> + + Gewerbekennzeichnung : bool <> <> + + Hrnummer : string <> <> + + Amtsgericht : string <> <> + + UmsatzsteuerId : string <> <> + + GlaeubigerId : string <> <> + + EMailAdresse : string <> <> + + Website : string <> <> +} +class "List`1" { +} +BusinessObject <|-- Geschaeftspartner +Geschaeftspartner --> "Kontaktweg" "List`1" +Geschaeftspartner --> "Geschaeftspartnerrolle" "List`1" +Geschaeftspartner --> "Partneradresse" Adresse +class Kosten { +} +class "List`1" { +} +BusinessObject <|-- Kosten +Kosten --> "Kostenklasse" Kostenklasse +Kosten --> "Gueltigkeit" Zeitraum +Kosten --> "SummeKosten" "List`1" +Kosten --> "Kostenbloecke" "List`1" +Kosten --> "Kostenpositionen" "List`1" +class Marktlokation { + + MarktlokationsId : string <> <> + + Verbrauchsart : Verbrauchsart? <> <> + + Unterbrechbar : bool? <> <> + + NetzbetreiberCodeNr : string <> <> + + GebietType : Gebiettyp? <> <> + + NetzgebietNr : string <> <> + + Bilanzierungsgebiet : string <> <> + + GrundversorgerCodeNr : string <> <> + + Gasqualitaet : Gasqualitaet? <> <> + + Regelzone : string <> <> + + Marktgebiet : string <> <> + + Zeitreihentyp : Zeitreihentyp? <> <> + + {static} ValidateId(id:string) : bool + + {static} GetChecksum(input:string) : string + + HasValidId() : bool + + IsValid(checkId:bool) : bool +} +class "List`1" { +} +BusinessObject <|-- Marktlokation +Marktlokation --> "Sparte" Sparte +Marktlokation --> "Energierichtung" Energierichtung +Marktlokation --> "Bilanzierungsmethode" Bilanzierungsmethode +Marktlokation --> "Netzebene" Netzebene +Marktlokation --> "Endkunde" Geschaeftspartner +Marktlokation --> "Lokationsadresse" Adresse +Marktlokation --> "Geoadresse" Geokoordinaten +Marktlokation --> "Katasterinformation" Katasteradresse +Marktlokation --> "Marktrollen" "List`1" +Marktlokation --> "Zaehlwerke" "List`1" +Marktlokation --> "Verbrauchsmenge" "List`1" +Marktlokation --> "Messlokationen" "List`1" +Marktlokation --> "ZugehoerigeMesslokationen" "List`1" +class Marktteilnehmer { + + Rollencodenummer : string <> <> + + Makoadresse : string <> <> +} +Geschaeftspartner <|-- Marktteilnehmer +Marktteilnehmer --> "Marktrolle" Marktrolle +Marktteilnehmer --> "Rollencodetyp" Rollencodetyp +Marktteilnehmer --> "Ansprechpartner" Ansprechpartner +class Messlokation { + + MesslokationsId : string <> <> + + NetzebeneMessung : Netzebene? <> <> + + MessgebietNr : string <> <> + + GrundzustaendigerMSBCodeNr : string <> <> + + GrundzustaendigerMSBIMCodeNr : string <> <> + + GrundzustaendigerMDLCodeNr : string <> <> + + Bilanzierungsmethode : Bilanzierungsmethode? <> <> + + Abrechnungmessstellenbetriebnna : bool? <> <> + + Gasqualitaet : Gasqualitaet? <> <> + + Verlustfaktor : decimal? <> <> + + {static} ValidateId(id:string) : bool + + HasValidId() : bool + + IsValid(checkId:bool) : bool +} +class "List`1" { +} +BusinessObject <|-- Messlokation +Messlokation --> "Sparte" Sparte +Messlokation --> "Messadresse" Adresse +Messlokation --> "Geoadresse" Geokoordinaten +Messlokation --> "Katasterinformation" Katasteradresse +Messlokation --> "Geraete" "List`1" +Messlokation --> "Messdienstleistung" "List`1" +Messlokation --> "Messlokationszaehler" "List`1" +Messlokation --> "Marktrollen" "List`1" +class Preisblatt { + + Bezeichnung : string <> <> +} +class "List`1" { +} +BusinessObject <|-- Preisblatt +Preisblatt --> "Gueltigkeit" Zeitraum +Preisblatt --> "Preispositionen" "List`1" +class PreisblattDienstleistung { + + Geraetedetails : Bilanzierungsmethode? <> <> +} +Preisblatt <|-- PreisblattDienstleistung +PreisblattDienstleistung --> "Dienstleistungsdetails" Dienstleistungstyp +PreisblattDienstleistung --> "Herausgeber" Marktteilnehmer +class PreisblattKonzessionsabgabe { +} +Preisblatt <|-- PreisblattKonzessionsabgabe +PreisblattKonzessionsabgabe --> "sparte" Sparte +PreisblattKonzessionsabgabe --> "KundengruppeKA" KundengruppeKA +class PreisblattMessung { +} +class "List`1" { +} +Preisblatt <|-- PreisblattMessung +PreisblattMessung --> "Sparte" Sparte +PreisblattMessung --> "Bilanzierungsmethode" Bilanzierungsmethode +PreisblattMessung --> "Messebene" Netzebene +PreisblattMessung --> "InklusiveDienstleistung" "List`1" +PreisblattMessung --> "Basisgeraet" Geraeteeigenschaften +PreisblattMessung --> "InklusiveGeraete" "List`1" +PreisblattMessung --> "Herausgeber" Marktteilnehmer +class PreisblattNetznutzung { +} +Preisblatt <|-- PreisblattNetznutzung +PreisblattNetznutzung --> "Sparte" Sparte +PreisblattNetznutzung --> "Bilanzierungsmethode" Bilanzierungsmethode +PreisblattNetznutzung --> "Netzebene" Netzebene +PreisblattNetznutzung --> "Kundengruppe" Kundengruppe +PreisblattNetznutzung --> "Herausgeber" Marktteilnehmer +class PreisblattUmlagen { +} +Preisblatt <|-- PreisblattUmlagen +PreisblattUmlagen --> "Sparte" Sparte +class Rechnung { + + Rechnungstitel : string <> <> + + Rechnungsstatus : Rechnungsstatus? <> <> + + Storno : bool <> <> + + Rechnungsnummer : string <> <> + + OriginalRechnungsnummer : string <> <> + + Rechnung() + + Rechnung(sapPrintDocument:JObject) +} +class "List`1" { +} +BusinessObject <|-- Rechnung +Rechnung --> "Rechnungsdatum" DateTime +Rechnung --> "Faelligkeitsdatum" DateTime +Rechnung --> "Rechnungsstyp" Rechnungstyp +Rechnung --> "Rechnungsperiode" Zeitraum +Rechnung --> "Rechnungsersteller" Geschaeftspartner +Rechnung --> "Rechnungsempfaenger" Geschaeftspartner +Rechnung --> "Gesamtnetto" Betrag +Rechnung --> "Gesamtsteuer" Betrag +Rechnung --> "Gesamtbrutto" Betrag +Rechnung --> "Vorausgezahlt" Betrag +Rechnung --> "rabattBrutto" Betrag +Rechnung --> "Zuzahlen" Betrag +Rechnung --> "Steuerbetraege" "List`1" +Rechnung --> "Rechnungspositionen" "List`1" +class Region { + + Bezeichnung : string <> <> +} +class "List`1" { +} +BusinessObject <|-- Region +Region --> "PositivListe" "List`1" +Region --> "NegativListe" "List`1" +class Vertrag { + + Vertragsnummer : string <> <> + + Beschreibung : string <> <> + + Gemeinderabatt : decimal? <> <> + + Vertrag() +} +class "List`1" { +} +BusinessObject <|-- Vertrag +Vertrag --> "Vertragsart" Vertragsart +Vertrag --> "Vertragstatus" Vertragstatus +Vertrag --> "Sparte" Sparte +Vertrag --> "Vertragsbeginn" DateTime +Vertrag --> "Vertragsende" DateTime +Vertrag --> "Vertragspartner1" Geschaeftspartner +Vertrag --> "Vertragspartner2" Geschaeftspartner +Vertrag --> "Unterzeichnervp1" "List`1" +Vertrag --> "Unterzeichnervp2" "List`1" +Vertrag --> "Vertragskonditionen" Vertragskonditionen +Vertrag --> "Vertragsteile" "List`1" +Vertrag --> "Korrespondenzpartner" Geschaeftspartner +class Zaehler { + + Zaehlernummer : string <> <> + + EichungBis : DateTime? <> <> + + LetzteEichung : DateTime? <> <> + + Gateway : string <> <> + + Fernschaltung : Fernschaltung? <> <> + + Messwerterfassung : Messwerterfassung? <> <> +} +class "List`1" { +} +BusinessObject <|-- Zaehler +Zaehler --> "Sparte" Sparte +Zaehler --> "Zaehlerauspraegung" Zaehlerauspraegung +Zaehler --> "Zaehlertyp" Zaehlertyp +Zaehler --> "Tarifart" Tarifart +Zaehler --> "zaehlerkonstante" Decimal +Zaehler --> "Zaehlwerke" "List`1" +Zaehler --> "Zaehlerhersteller" Geschaeftspartner +class Adresse { + + Postleitzahl : string <> <> + + Ort : string <> <> + + Strasse : string <> <> + + Hausnummer : string <> <> + + Postfach : string <> <> + + Adresszusatz : string <> <> + + CoErgaenzung : string <> <> + + Landescode : Landescode? <> <> +} +COM <|-- Adresse +class Angebotsposition { + + Positionsbezeichung : string <> <> +} +COM <|-- Angebotsposition +Angebotsposition --> "Positionsmenge" Menge +Angebotsposition --> "Positionspreis" Preis +Angebotsposition --> "Positionsbetrag" Betrag +class Angebotsteil { + + AnfrageSubreferenz : string <> <> +} +class "List`1" { +} +COM <|-- Angebotsteil +Angebotsteil --> "Lieferstellenangebotsteil" "List`1" +Angebotsteil --> "Gesamtmengeangebotsteil" Menge +Angebotsteil --> "Gesamtkostenangebotsteil" Betrag +Angebotsteil --> "Positionen" "List`1" +class Angebotsvariante { + + Beschreibung : string <> <> +} +class "List`1" { +} +COM <|-- Angebotsvariante +Angebotsvariante --> "Angebotsstatus" Angebotsstatus +Angebotsvariante --> "Erstelldatum" DateTime +Angebotsvariante --> "Bindefrist" DateTime +Angebotsvariante --> "Gesamtmenge" Menge +Angebotsvariante --> "Gesamtkosten" Betrag +Angebotsvariante --> "Teile" "List`1" +class AufAbschlag { + + Bezeichnung : string <> <> + + Beschreibung : string <> <> + + AufAbschlagstyp : AufAbschlagstyp? <> <> + + aufAbschlagsziel : AufAbschlagsziel? <> <> + + Einheit : Waehrungseinheit? <> <> + + Website : string <> <> +} +class "List`1" { +} +COM <|-- AufAbschlag +AufAbschlag --> "Gueltigkeitszeitraum" Zeitraum +AufAbschlag --> "Staffeln" "List`1" +class Aufgabe { + + AufgabenId : string <> <> + + Beschreibung : string <> <> + + Deadline : DateTime? <> <> + + Ausgefuehrt : bool <> <> + + Ausfuehrungszeitpunkt : DateTime? <> <> + + Ausfuehrender : string <> <> +} +COM <|-- Aufgabe +class Ausschreibungsdetail { + + LokationsId : string <> <> + + Lokationsbezeichung : string <> <> + + Netzbetreiber : string <> <> + + Kunde : string <> <> + + Zaehlernummer : string <> <> + + Zaehlertechnik : Zaehlertyp? <> <> + + LastgangVorhanden : bool? <> <> +} +COM <|-- Ausschreibungsdetail +Ausschreibungsdetail --> "NetzebeneLieferung" Netzebene +Ausschreibungsdetail --> "NetzebeneMessung" Netzebene +Ausschreibungsdetail --> "Lokationsadresse" Adresse +Ausschreibungsdetail --> "Rechnungsadresse" Adresse +Ausschreibungsdetail --> "PrognoseJahresarbeit" Menge +Ausschreibungsdetail --> "PrognoseArbeitLieferzeitraum" Menge +Ausschreibungsdetail --> "PrognoseLeistung" Menge +Ausschreibungsdetail --> "Lieferzeitraum" Zeitraum +class Ausschreibungslos { + + Losnummer : string <> <> + + Bezeichung : string <> <> + + Bemerkung : string <> <> + + BetreutDurch : string <> <> + + AnzahlLieferstellen : int <> <> +} +class "List`1" { +} +COM <|-- Ausschreibungslos +Ausschreibungslos --> "Preismodell" Preismodell +Ausschreibungslos --> "Energieart" Sparte +Ausschreibungslos --> "WunschRechnungslegung" Rechnungslegung +Ausschreibungslos --> "WunschVertragsform" Vertragsform +Ausschreibungslos --> "Lieferstellen" "List`1" +Ausschreibungslos --> "Gesamtmenge" Menge +Ausschreibungslos --> "WunschMindestmenge" Menge +Ausschreibungslos --> "WunschMaximalmenge" Menge +Ausschreibungslos --> "Wiederholungsintervall" Zeitraum +Ausschreibungslos --> "lieferzeitraum" Zeitraum +Ausschreibungslos --> "WunschKuendingungsfrist" Zeitraum +Ausschreibungslos --> "WunschZahlungsziel" Zeitraum +class Betrag { + + Wert : decimal <> <> +} +COM <|-- Betrag +Betrag --> "Waehrung" Waehrungscode +abstract class COM { + + <> Equals(b:object) : bool + + Equals(b:COM) : bool + + <> GetHashCode() : int + + IsValid() : bool + + Guid : string <> <> +} +class "IEquatable`1" { +} +class "IDictionary`2" { +} +"IEquatable`1" "" <|-- COM +COM --> "UserProperties" "IDictionary`2" +class Dienstleistung { + + Bezeichnung : string <> <> +} +COM <|-- Dienstleistung +Dienstleistung --> "Dienstleistungstyp" Dienstleistungstyp +class Energieherkunft { + + AnteilProzent : decimal <> <> +} +COM <|-- Energieherkunft +Energieherkunft --> "Erzeugungsart" Erzeugungsart +class Energiemix { + + Energiemixnummer : int <> <> + + Bezeichnung : string <> <> + + Bemerkung : string <> <> + + Gueltigkeitsjahr : int <> <> + + CO2Emission : decimal? <> <> + + Atommuell : decimal? <> <> + + OekoTopTen : bool? <> <> + + Website : string <> <> +} +class "List`1" { +} +COM <|-- Energiemix +Energiemix --> "Energieart" Sparte +Energiemix --> "oekozertifikat" "List`1" +Energiemix --> "Oekolabel" "List`1" +Energiemix --> "Anteil" "List`1" +class GenericStringStringInfo { + + KeyColumn : string <> <> + + Value : string <> <> + + ToKeyValuePair() : KeyValuePair +} +COM <|-- GenericStringStringInfo +class Geokoordinaten { + + Breitengrad : decimal <> <> + + Laengengrad : decimal <> <> +} +COM <|-- Geokoordinaten +class Geraet { + + Geraetenummer : string <> <> +} +COM <|-- Geraet +Geraet --> "Geraeteeigenschaften" Geraeteeigenschaften +class Geraeteeigenschaften { + + Geraetemerkmal : Geraetemerkmal? <> <> +} +COM <|-- Geraeteeigenschaften +Geraeteeigenschaften --> "Geraetetyp" Geraetetyp +class Hardware { + + Bezeichnung : string <> <> + + Geraetenummer : string <> <> + + Geraetereferenz : string <> <> +} +COM <|-- Hardware +Hardware --> "Geraetetyp" Geraetetyp +Hardware --> "Geraeteeigenschaften" Geraeteeigenschaften +class Katasteradresse { + + Gemarkung_flur : string <> <> + + Flurstueck : string <> <> +} +COM <|-- Katasteradresse +class Konzessionsabgabe { + + Kosten : decimal <> <> + + Kategorie : string <> <> +} +COM <|-- Konzessionsabgabe +Konzessionsabgabe --> "Satz" AbgabeArt +class Kostenblock { + + Kostenblockbezeichnung : string <> <> +} +class "List`1" { +} +COM <|-- Kostenblock +Kostenblock --> "SummeKostenblock" Betrag +Kostenblock --> "Kostenpositionen" "List`1" +class Kostenposition { + + Positionstitel : string <> <> + + Von : DateTime? <> <> + + Bis : DateTime? <> <> + + Artikelbezeichnung : string <> <> + + Artikeldetail : string <> <> +} +COM <|-- Kostenposition +Kostenposition --> "Menge" Menge +Kostenposition --> "Zeitmenge" Menge +Kostenposition --> "Einzelpreis" Preis +Kostenposition --> "BetragKostenposition" Betrag +class KriteriumsWert { + + Wert : string <> <> +} +COM <|-- KriteriumsWert +KriteriumsWert --> "Kriterium" Tarifregionskriterium +class Marktrolle { + + Rollencodenummer : string <> <> + + Code : string <> <> +} +COM <|-- Marktrolle +class Menge { + + Wert : decimal <> <> +} +COM <|-- Menge +Menge --> "Einheit" Mengeneinheit +class Messlokationszuordnung { + + MesslokationsId : string <> <> + + Arithmetik : ArithmetischeOperation? <> <> + + GueltigSeit : DateTime? <> <> + + GueltigBis : DateTime? <> <> +} +COM <|-- Messlokationszuordnung +class Notiz { + + Autor : string <> <> + + Inhalt : string <> <> + + CleanUpSapNotes(context:StreamingContext) : void +} +COM <|-- Notiz +Notiz --> "Zeitpunkt" DateTime +class PhysikalischerWert { + + Wert : decimal <> <> + + PhysikalischerWert(wert:decimal, einheit:Mengeneinheit) + + PhysikalischerWert(wert:decimal, einheitString:string) +} +COM <|-- PhysikalischerWert +PhysikalischerWert --> "Einheit" Mengeneinheit +class PositionsAufAbschlag { + + Bezeichnung : string <> <> + + Beschreibung : string <> <> + + AufAbschlagswert : decimal <> <> +} +COM <|-- PositionsAufAbschlag +PositionsAufAbschlag --> "AufAbschlagstyp" AufAbschlagstyp +PositionsAufAbschlag --> "AufAbschlagswaehrung" Waehrungseinheit +class Preis { + + Wert : decimal <> <> + + Status : Preisstatus? <> <> +} +COM <|-- Preis +Preis --> "Einheit" Waehrungseinheit +Preis --> "Bezugswert" Mengeneinheit +class Preisgarantie { + + Beschreibung : string <> <> +} +COM <|-- Preisgarantie +Preisgarantie --> "Preisgarantietyp" Preisgarantietyp +Preisgarantie --> "ZeitlicheGueltigkeit" Zeitraum +class Preisposition { + + Leistungsbezeichung : string <> <> + + Zeitbasis : Zeiteinheit? <> <> + + Tarifzeit : Tarifzeit? <> <> + + BdewArtikelnummer : BDEWArtikelnummer? <> <> + + Zonungsgroesse : Bemessungsgroesse? <> <> +} +class "List`1" { +} +COM <|-- Preisposition +Preisposition --> "Berechnungsmethode" Kalkulationsmethode +Preisposition --> "Leistungstyp" Leistungstyp +Preisposition --> "Preiseinheit" Waehrungseinheit +Preisposition --> "Bezugsgroesse" Mengeneinheit +Preisposition --> "Zu_abschlaege" PositionsAufAbschlag +Preisposition --> "Preisstaffeln" "List`1" +class Preisstaffel { + + Einheitspreis : decimal <> <> + + StaffelgrenzeVon : decimal <> <> + + StaffelgrenzeBis : decimal <> <> +} +COM <|-- Preisstaffel +Preisstaffel --> "Sigmoidparameter" Sigmoidparameter +class Rechnungsposition { + + Positionsnummer : int <> <> + + Positionstext : string <> <> + + Zeiteinheit : Mengeneinheit? <> <> + + Artikelnummer : BDEWArtikelnummer? <> <> + + LokationsId : string <> <> + + VertragskontoId : string <> <> + + VertragsId : string <> <> + + Status : RechnungspositionsStatus? <> <> +} +COM <|-- Rechnungsposition +Rechnungsposition --> "LieferungVon" DateTime +Rechnungsposition --> "LieferungBis" DateTime +Rechnungsposition --> "PositionsMenge" Menge +Rechnungsposition --> "ZeitbezogeneMenge" Menge +Rechnungsposition --> "Einzelpreis" Preis +Rechnungsposition --> "TeilsummeNetto" Betrag +Rechnungsposition --> "TeilrabattNetto" Betrag +Rechnungsposition --> "TeilsummeSteuer" Steuerbetrag +class RechnungspositionFlat { + + Positionsnummer : int <> <> + + Positionstext : string <> <> + + LokationsId : string <> <> + + VertragskontoId : string <> <> + + PreisWert : decimal <> <> + + PreisStatus : Preisstatus? <> <> + + PositionsMengeWert : decimal? <> <> + + PositionsMengeEinheit : Mengeneinheit? <> <> + + VertragsId : string <> <> + + Status : RechnungspositionsStatus? <> <> + + RechnungspositionFlat(rp:Rechnungsposition) + + ToRechnungsposition() : Rechnungsposition + + RechnungspositionFlat() +} +COM <|-- RechnungspositionFlat +RechnungspositionFlat --> "LieferungVon" DateTime +RechnungspositionFlat --> "LieferungBis" DateTime +RechnungspositionFlat --> "PreisEinheit" Waehrungseinheit +RechnungspositionFlat --> "PreisBezugswert" Mengeneinheit +class RegionaleGueltigkeit { +} +class "List`1" { +} +COM <|-- RegionaleGueltigkeit +RegionaleGueltigkeit --> "Gueltigkeitstyp" Gueltigkeitstyp +RegionaleGueltigkeit --> "KriteriumsWerte" "List`1" +class RegionalePreisgarantie { +} +Preisgarantie <|-- RegionalePreisgarantie +RegionalePreisgarantie --> "RegionaleGueltigkeit" RegionaleGueltigkeit +class RegionalePreisstaffel { +} +Preisstaffel <|-- RegionalePreisstaffel +RegionalePreisstaffel --> "RegionaleGueltigkeit" RegionaleGueltigkeit +class RegionalerAufAbschlag { + + Bezeichnung : string <> <> + + Beschreibung : string <> <> + + AufAbschlagstyp : AufAbschlagstyp? <> <> + + AufAbschlagsziel : AufAbschlagsziel? <> <> + + Einheit : Waehrungseinheit? <> <> + + Website : string <> <> + + Tarifnamensaenderungen : string <> <> +} +class "List`1" { +} +COM <|-- RegionalerAufAbschlag +RegionalerAufAbschlag --> "Zusatzprodukte" "List`1" +RegionalerAufAbschlag --> "Voraussetzungen" "List`1" +RegionalerAufAbschlag --> "Gueltigkeitszeitraum" Zeitraum +RegionalerAufAbschlag --> "Energiemixaenderung" Energiemix +RegionalerAufAbschlag --> "Vertagskonditionsaenderung" Vertragskonditionen +RegionalerAufAbschlag --> "Garantieaenderung" Preisgarantie +RegionalerAufAbschlag --> "Einschraenkungsaenderung" Tarifeinschraenkung +RegionalerAufAbschlag --> "Staffeln" "List`1" +class RegionaleTarifpreisposition { + + Einheit : string <> <> + + Mengeneinheitstaffel : Mengeneinheit? <> <> +} +class "List`1" { +} +COM <|-- RegionaleTarifpreisposition +RegionaleTarifpreisposition --> "Preistyp" Preistyp +RegionaleTarifpreisposition --> "Bezugseinheit" Mengeneinheit +RegionaleTarifpreisposition --> "Preisstaffeln" "List`1" +class Regionskriterium { + + Sparte : Sparte? <> <> + + Wert : string <> <> +} +COM <|-- Regionskriterium +Regionskriterium --> "Gueltigkeitstyp" Gueltigkeitstyp +Regionskriterium --> "Mengenoperator" Mengenoperator +Regionskriterium --> "Regionskriteriumtyp" Regionskriteriumtyp +class Rufnummer { + + rufnummer : string <> <> +} +COM <|-- Rufnummer +Rufnummer --> "Nummerntyp" Rufnummernart +class Sigmoidparameter { + + A : decimal <> <> + + B : decimal <> <> + + C : decimal <> <> + + D : decimal <> <> +} +COM <|-- Sigmoidparameter +class Steuerbetrag { + + Basiswert : decimal <> <> + + Steuerwert : decimal <> <> +} +COM <|-- Steuerbetrag +Steuerbetrag --> "Steuerkennzeichen" Steuerkennzeichen +Steuerbetrag --> "Waehrung" Waehrungscode +class Tarifberechnungsparameter { + + Berechnungsmethode : Tarifkalkulationsmethode? <> <> + + MesspreisInGPEnthalten : string <> <> + + Messpreistyp : Messpreistyp? <> <> + + KwInklusive : decimal? <> <> + + KwWeitereMengen : decimal? <> <> + + MesspreisBeruecksichtigen : bool? <> <> +} +COM <|-- Tarifberechnungsparameter +Tarifberechnungsparameter --> "HoechstpreisNT" Preis +Tarifberechnungsparameter --> "HoechstpreisHT" Preis +Tarifberechnungsparameter --> "Mindestpreis" Preis +class Tarifeinschraenkung { +} +class "List`1" { +} +COM <|-- Tarifeinschraenkung +Tarifeinschraenkung --> "Zusatzprodukte" "List`1" +Tarifeinschraenkung --> "Voraussetzungen" "List`1" +Tarifeinschraenkung --> "Einschraenkungzaehler" Geraet +Tarifeinschraenkung --> "Einschraenkungleistung" Menge +class Tarifpreisposition { + + Mengeneinheitstaffel : Mengeneinheit? <> <> +} +COM <|-- Tarifpreisposition +Tarifpreisposition --> "Preistyp" Preistyp +Tarifpreisposition --> "Einheit" Waehrungseinheit +Tarifpreisposition --> "Bezugseinheit" Mengeneinheit +Tarifpreisposition --> "Preisstaffeln" Preisstaffel +class Unterschrift { + + Ort : string <> <> + + Datum : DateTime? <> <> + + Name : string <> <> +} +COM <|-- Unterschrift +class Verbrauch { + {static} Verbrauch() + + Obiskennzahl : string <> <> + + Wert : decimal <> <> + + Type : Verbrauchsmengetyp? <> <> + + {static} FixSapCdsBug(v:Verbrauch) : Verbrauch + + FixSapCdsBug() : void +} +enum SapTimezone { + UTC, + GMT, + CET, + MEZ, + CEST, + MESZ, +} +COM <|-- Verbrauch +Verbrauch --> "CENTRAL_EUROPE_STANDARD_TIME" TimeZoneInfo +Verbrauch --> "Startdatum" DateTime +Verbrauch --> "Enddatum" DateTime +Verbrauch --> "Wertermittlungsverfahren" Wertermittlungsverfahren +Verbrauch --> "Einheit" Mengeneinheit +Verbrauch +-- SapTimezone +class Vertragskonditionen { + + Beschreibung : string <> <> + + AnzahlAbschlaege : int? <> <> + + StartAbrechnungsjahr : DateTime? <> <> + + TurnusablesungIntervall : int? <> <> + + NetznutzungsabrechnungIntervall : int? <> <> + + Haushaltskunde : bool? <> <> + + Netznutzungsvertrag : NetznutzungsVertrag? <> <> + + Netznutzungszahler : Netznutzungszahler? <> <> + + Netznutzungsabrechnungsvariante : Netznutzungsabrechnungsvariante? <> <> + + Netznutzungsabrechnungsgrundlage : Netznutzungsabrechnungsgrundlage? <> <> +} +COM <|-- Vertragskonditionen +Vertragskonditionen --> "Vertragslaufzeit" Zeitraum +Vertragskonditionen --> "Kuendigungsfrist" Zeitraum +Vertragskonditionen --> "Vertragsverlaengerung" Zeitraum +Vertragskonditionen --> "Abschlagszyklus" Zeitraum +Vertragskonditionen --> "GeplanteTurnusablesung" Zeitraum +Vertragskonditionen --> "Netznutzungsabrechnung" Zeitraum +class Vertragsteil { + + Lokation : string <> <> + + Verbrauchsaufteilung : string <> <> +} +COM <|-- Vertragsteil +Vertragsteil --> "Vertragsteilbeginn" DateTime +Vertragsteil --> "Vertragsteilende" DateTime +Vertragsteil --> "VertraglichFixierteMenge" Menge +Vertragsteil --> "MinimaleAbnahmemenge" Menge +Vertragsteil --> "MaximaleAbnahmemenge" Menge +Vertragsteil --> "Jahresverbrauchsprognose" Menge +Vertragsteil --> "Kundenwert" Menge +class Zaehlwerk { + + ZaehlwerkId : string <> <> + + Bezeichnung : string <> <> + + ObisKennzahl : string <> <> + + Wandlerfaktor : decimal <> <> + + Kennzahl : string <> <> + + Schwachlastfaehig : Schwachlastfaehig? <> <> + + Verbrauchsart : Verbrauchsart? <> <> + + Unterbrechbarkeit : Unterbrechbarkeit? <> <> + + Waermenutzung : Waermenutzung? <> <> + + Steuerbefreit : bool? <> <> + + Vorkommastelle : int? <> <> + + Nachkommastelle : int? <> <> +} +class "List`1" { +} +COM <|-- Zaehlwerk +Zaehlwerk --> "Richtung" Energierichtung +Zaehlwerk --> "Einheit" Mengeneinheit +Zaehlwerk --> "Verwendungszwecke" "List`1" +Zaehlwerk --> "Konzessionsabgabe" Konzessionsabgabe +class Zeitraum { + + Einheit : Zeiteinheit? <> <> + + Dauer : decimal? <> <> + + Startdatum : DateTime? <> <> + + Enddatum : DateTime? <> <> + + FillNullValues(context:StreamingContext) : void +} +COM <|-- Zeitraum +class Zustaendigkeit { + + Jobtitel : string <> <> + + Abteilung : string <> <> + + Themengebiet : string <> <> +} +COM <|-- Zustaendigkeit +enum AbgabeArt { + KAS, + SA, + SAS, + TA, + TAS, + TK, + TKS, + TS, + TSS, +} +enum Angebotsstatus { + KONZEPTION, + UNVERBINDLICH, + VERBINDLICH, + BEAUFTRAGT, + UNGUELTIG, + ABGELEHNT, + NACHGEFASST, + AUSSTEHEND, + ERLEDIGT, +} +enum Anrede { + HERR, + FRAU, + EHELEUTE, + FIRMA, + INDIVIDUELL, + DR, +} +enum ArithmetischeOperation { + ADDITION, + SUBTRAKTION, + MULTIPLIKATION, + DIVISION, +} +enum AufAbschlagstyp { + RELATIV, + ABSOLUT, +} +enum AufAbschlagsziel { + ARBEITSPREIS_HT, + ARBEITSPREIS_NT, + ARBEITSPREIS_HT_NT, + GRUNDPREIS, + GESAMTPREIS, +} +enum Ausschreibungsportal { + ENPORTAL, + ENERGIE_AGENTUR, + BMWI, + ENERGIE_HANDELSPLATZ, + BUND, + VERA_ONLINE, + ISPEX, + ENERGIEMARKTPLATZ, + EVERGABE, + DTAD, +} +enum Ausschreibungsstatus { + PHASE1, + PHASE2, + PHASE3, + PHASE4, +} +enum Ausschreibungstyp { + OEFFENTLICHRECHTLICH, + EUROPAWEIT, +} +enum BDEWArtikelnummer { + LEISTUNG, + LEISTUNG_PAUSCHAL, + GRUNDPREIS, + REGELENERGIE_ARBEIT, + REGELENERGIE_LEISTUNG, + NOTSTROMLIEFERUNG_ARBEIT, + NOTSTROMLIEFERUNG_LEISTUNG, + RESERVENETZKAPAZITAET, + RESERVELEISTUNG, + ZUSAETZLICHE_ABLESUNG, + PRUEFGEBUEHREN_AUSSERPLANMAESSIG, + WIRKARBEIT, + SINGULAER_GENUTZTE_BETRIEBSMITTEL, + ABGABE_KWKG, + ABSCHLAG, + KONZESSIONSABGABE, + ENTGELT_FERNAUSLESUNG, + UNTERMESSUNG, + BLINDMEHRARBEIT, + ENTGELT_ABRECHNUNG, + SPERRKOSTEN, + ENTSPERRKOSTEN, + MAHNKOSTEN, + MEHR_MINDERMENGEN, + INKASSOKOSTEN, + BLINDMEHRLEISTUNG, + ENTGELT_MESSUNG_ABLESUNG, + ENTGELT_EINBAU_BETRIEB_WARTUNG_MESSTECHNIK, + AUSGLEICHSENERGIE, + ZAEHLEINRICHTUNG, + WANDLER_MENGENUMWERTER, + KOMMUNIKATIONSEINRICHTUNG, + TECHNISCHE_STEUEREINRICHTUNG, + PARAGRAF_19_STROM_NEV_UMLAGE, + BEFESTIGUNGSEINRICHTUNG, + OFFSHORE_HAFTUNGSUMLAGE, + FIXE_ARBEITSENTGELTKOMPONENTE, + FIXE_LEISTUNGSENTGELTKOMPONENTE, + UMLAGE_ABSCHALTBARE_LASTEN, + MEHRMENGE, + MINDERMENGE, + ENERGIESTEUER, + SMARTMETER_GATEWAY, + STEUERBOX, + MSB_INKL_MESSUNG, +} +enum Bearbeitungsstatus { + OFFEN, + IN_BEARBEITUNG, + ABGESCHLOSSEN, + STORNIERT, + QUITTIERT, + IGNORIERT, +} +enum Bemessungsgroesse { + WIRKARBEIT_EL, + LEISTUNG_EL, + BLINDARBEIT_KAP, + BLINDARBEIT_IND, + BLINDLEISTUNG_KAP, + BLINDLEISTUNG_IND, + WIRKARBEIT_TH, + LEISTUNG_TH, + VOLUMEN, + VOLUMENSTROM, + BENUTZUNGSDAUER, + ANZAHL, +} +enum Bilanzierungsmethode { + RLM, + SLP, + TLP_GEMEINSAM, + TLP_GETRENNT, + PAUSCHAL, + IMS, +} +enum BoTyp { + ANSPRECHPARTNER, + ENERGIEMENGE, + GESCHAEFTSOBJEKT, + GESCHAEFTSPARTNER, + MARKTLOKATION, + MARKTTEILNEHMER, + MESSLOKATION, + ZAEHLER, + KOSTEN, + TARIF, + PREISBLATT, + PREISBLATTNETZNUTZUNG, + PREISBLATTMESSUNG, + PREISBLATTUMLAGEN, + PREISBLATTDIENSTLEISTUNG, + PREISBLATTKONZESSIONSABGABE, + ZEITREIHE, + LASTGANG, +} +enum Dienstleistungstyp { + DATENBEREITSTELLUNG_TAEGLICH, + DATENBEREITSTELLUNG_WOECHENTLICH, + DATENBEREITSTELLUNG_MONATLICH, + DATENBEREITSTELLUNG_JAEHRLICH, + DATENBEREITSTELLUNG_HISTORISCHE_LG, + DATENBEREITSTELLUNG_STUENDLICH, + DATENBEREITSTELLUNG_VIERTELJAEHRLICH, + DATENBEREITSTELLUNG_HALBJAEHRLICH, + DATENBEREITSTELLUNG_MONATLICH_ZUSAETZLICH, + DATENBEREITSTELLUNG_EINMALIG, + AUSLESUNG_2X_TAEGLICH_FERNAUSLESUNG, + AUSLESUNG_TAEGLICH_FERNAUSLESUNG, + AUSLESUNG_LGK_MANUELL_MSB, + AUSLESUNG_MONATLICH_SLP_FERNAUSLESUNG, + AUSLESUNG_JAEHRLICH_SLP_FERNAUSLESUNG, + AUSLESUNG_MDE_SLP, + ABLESUNG_MONATLICH_SLP, + ABLESUNG_VIERTELJAEHRLICH_SLP, + ABLESUNG_HALBJAEHRLICH_SLP, + ABLESUNG_JAEHRLICH_SLP, + AUSLESUNG_SLP_FERNAUSLESUNG, + ABLESUNG_SLP_ZUSAETZLICH_MSB, + ABLESUNG_SLP_ZUSAETZLICH_KUNDE, + AUSLESUNG_LGK_FERNAUSLESUNG_ZUSAETZLICH_MSB, + AUSLESUNG_MOATLICH_FERNAUSLESUNG, + AUSLESUNG_STUENDLICH_FERNAUSLESUNG, + ABLESUNG_MONATLICH_LGK, + AUSLESUNG_TEMERATURMENGENUMWERTER, + AUSLESUNG_ZUSTANDSMENGENUMWERTER, + AUSLESUNG_SYSTEMMENGENUMWERTER, + AUSLESUNG_VORGANG_SLP, + AUSLESUUNG_KOMPAKTMENGENUMWERTER, + AUSLESUNG_MDE_LGK, + SPERRUNG_SLP, + ENTSPERRUNG_SLP, + SPERRUNG_RLM, + ENTSPERRUNG_RLM, + MAHNKOSTEN, + INKASSOKOSTEN, +} +enum EncryptionScheme { + SodiumSymmetricAEAD, + SodiumAsymmetricPublicKeyBox, + BouncyCastleCMS, +} +enum Energierichtung { + AUSSP, + EINSP, +} +enum Erzeugungsart { + KWK, + WIND, + SOLAR, + KERNKRAFT, + WASSER, + GEOTHERMIE, + BIOMASSE, + KOHLE, + GAS, + SONSTIGE, + SONSTIGE_EEG, +} +enum Fernschaltung { + VORHANDEN, + NICHT_VORHANDEN, +} +enum Gasqualitaet { + H_GAS= 1, + L_GAS= 2, + HGAS= 1, + LGAS= 2, +} +enum Gebiettyp { + REGELZONE, + MARKTGEBIET, + BILANZIERUNGSGEBIET, + VERTEILNETZ, + TRANSPORTNETZ, + REGIONALNETZ, + AREALNETZ, + GRUNDVERSORGUNGSGEBIET, + VERSORGUNGSGEBIET, +} +enum Geraetemerkmal { + EINTARIF, + ZWEITARIF, + MEHRTARIF, + GAS_G2_5, + GAS_G4, + GAS_G6, + GAS_G10, + GAS_G16, + GAS_G25, + GAS_G40, + GAS_G65, + GAS_G100, + GAS_G160, + GAS_G250, + GAS_G400, + GAS_G650, + GAS_G1000, + GAS_G1600, + GAS_G2500, + IMPULSGEBER_G4_G100, + IMPULSGEBER_G100, + MODEM_GSM, + MODEM_GPRS, + MODEM_FUNK, + MODEM_GSM_O_LG, + MODEM_GSM_M_LG, + MODEM_FESTNETZ, + MODEM_GPRS_M_LG, + PLC_COM, + ETHERNET_KOM, + DSL_KOM, + LTE_KOM, + RUNDSTEUEREMPFAENGER, + TARIFSCHALTGERAET, + ZUSTANDS_MU, + TEMPERATUR_MU, + KOMPAKT_MU, + SYSTEM_MU, +} +enum Geraetetyp { + WECHSELSTROMZAEHLER, + DREHSTROMZAEHLER, + ZWEIRICHTUNGSZAEHLER, + RLM_ZAEHLER, + IMS_ZAEHLER, + BALGENGASZAEHLER, + MAXIMUMZAEHLER, + MULTIPLEXANLAGE, + PAUSCHALANLAGE, + VERSTAERKERANLAGE, + SUMMATIONSGERAET, + IMPULSGEBER, + EDL_21_ZAEHLERAUFSATZ, + VIER_QUADRANTEN_LASTGANGZAEHLER, + MENGENUMWERTER, + STROMWANDLER, + SPANNUNGSWANDLER, + DATENLOGGER, + KOMMUNIKATIONSANSCHLUSS, + MODEM, + TELEKOMMUNIKATIONSEINRICHTUNG, + DREHKOLBENGASZAEHLER, + TURBINENRADGASZAEHLER, + ULTRASCHALLZAEHLER, + WIRBELGASZAEHLER, + MODERNE_MESSEINRICHTUNG, + ELEKTRONISCHER_HAUSHALTSZAEHLER, + STEUEREINRICHTUNG, + TECHNISCHESTEUEREINRICHTUNG, + TARIFSCHALTGERAET, + RUNDSTEUEREMPFAENGER, + OPTIONALE_ZUS_ZAEHLEINRICHTUNG, + MESSWANDLERSATZ_IMS_MME, + KOMBIMESSWANDLER_IMS_MME, + TARIFSCHALTGERAET_IMS_MME, + RUNDSTEUEREMPFAENGER_IMS_MME, + TEMPERATUR_KOMPENSATION, + HOECHSTBELASTUNGS_ANZEIGER, + SONSTIGES_GERAET, + SMARTMETERGATEWAY, + STEUERBOX, + BLOCKSTROMWANDLER, + KOMBIMESSWANDLER, +} +enum Geschaeftspartnerrolle { + LIEFERANT, + DIENSTLEISTER, + KUNDE, + INTERESSENT, + MARKTPARTNER, +} +enum Gueltigkeitstyp { + NICHT_IN, +} +enum Kalkulationsmethode { + KEINE, + STAFFELN, + ZONEN, + VORZONEN_GP, + SIGMOID, + BLINDARBEIT_GT_50_PROZENT, + BLINDARBEIT_GT_40_PROZENT, + AP_GP_ZONEN, + LP_INSTALL_LEISTUNG, + AP_TRANSPORT_ODER_VERTEILNETZ, + AP_TRANSPORT_ODER_VERTEILNETZ_ORTSVERTEILNETZ_SIGMOID, + LP_JAHRESVERBRAUCH, + LP_TRANSPORT_ODER_VERTEILNETZ, + LP_TRANSPORT_ODER_VERTEILNETZ_ORTSVERTEILNETZ_SIGMOID, + FUNKTIONEN, + VERBRAUCH_UEBER_SLP_GRENZE_FUNKTIONSBEZOGEN_WEITERE_BERECHNUNG_ALS_LGK, +} +enum Kontaktart { + ANSCHREIBEN, + TELEFONAT, + FAX, + E_MAIL, + SMS, +} +enum Kostenklasse { +} +enum Kundengruppe { + RLM, + SLP_S_G0, + SLP_S_G1, + SLP_S_G2, + SLP_S_G3, + SLP_S_G4, + SLP_S_G5, + SLP_S_G6, + SLP_S_G7, + SLP_S_L0, + SLP_S_L1, + SLP_S_L2, + SLP_S_H0, + SLP_S_SB, + SLP_S_HZ, + SLP_S_WP, + SLP_G_GKO, + SLP_G_GHA, + SLP_G_GMK, + SLP_G_GBD, + SLP_G_GGA, + SLP_G_GBH, + SLP_G_GBA, + SLP_G_GWA, + SLP_G_GGB, + SLP_G_GPD, + SLP_G_GMF, + SLP_G_HEF, + SLP_G_HMF, + SLP_G_HKO, +} +enum KundengruppeKA { + S_TARIF_25000, + S_TARIF_100000, + S_TARIF_500000, + S_TARIF_G_500000, + S_SONDERKUNDE, + G_KOWA_25000, + G_KOWA_100000, + G_KOWA_500000, + G_KOWA_G_500000, + G_TARIF_25000, + G_TARIF_100000, + G_TARIF_500000, + G_TARIF_G_500000, + G_SONDERKUNDE, + SONDER_KAS, + SONDER_SAS, + SONDER_TAS, + SONDER_TKS, + SONDER_TSS, +} +enum Kundentyp { + PRIVAT, + LANDWIRT, + SONSTIGE, + HAUSHALT, + DIREKTHEIZUNG, + GEMEINSCHAFT_MFH, + KIRCHE, + KWK, + LADESAEULE, + BELEUCHTUNG_OEFFENTLICH, + BELEUCHTUNG_STRASSE, + SPEICHERHEIZUNG, + UNTERBR_EINRICHTUNG, + WAERMEPUMPE, +} +enum Landescode { + AC, + AD, + AE, + AF, + AG, + AI, + AL, + AM, + AN, + AO, + AQ, + AR, + AS, + AT, + AU, + AW, + AX, + AZ, + BA, + BB, + BD, + BE, + BF, + BG, + BH, + BI, + BJ, + BL, + BM, + BN, + BO, + BQ, + BR, + BS, + BT, + BU, + BV, + BW, + BY, + BZ, + CA, + CC, + CD, + CF, + CG, + CH, + CI, + CK, + CL, + CM, + CN, + CO, + CP, + CR, + CS, + CU, + CV, + CW, + CX, + CY, + CZ, + DE, + DG, + DJ, + DK, + DM, + DO, + DZ, + EA, + EC, + EE, + EG, + EH, + ER, + ES, + ET, + EU, + FI, + FJ, + FK, + FM, + FO, + FR, + FX, + GA, + GB, + GD, + GE, + GF, + GG, + GH, + GI, + GL, + GM, + GN, + GP, + GQ, + GR, + GS, + GT, + GU, + GW, + GY, + HK, + HM, + HN, + HR, + HT, + HU, + IC, + ID, + IE, + IL, + IM, + IN, + IO, + IQ, + IR, + IS, + IT, + JE, + JM, + JO, + JP, + KE, + KG, + KH, + KI, + KM, + KN, + KP, + KR, + KW, + KY, + KZ, + LA, + LB, + LC, + LI, + LK, + LR, + LS, + LT, + LU, + LV, + LY, + MA, + MC, + MD, + ME, + MF, + MG, + MH, + MK, + ML, + MM, + MN, + MO, + MP, + MQ, + MR, + MS, + MT, + MU, + MV, + MW, + MX, + MY, + MZ, + NA, + NC, + NE, + NF, + NG, + NI, + NL, + NO, + NP, + NR, + NT, + NU, + NZ, + OM, + PA, + PE, + PF, + PG, + PH, + PK, + PL, + PM, + PN, + PR, + PS, + PT, + PW, + PY, + QA, + RE, + RO, + RS, + RU, + RW, + SA, + SB, + SC, + SD, + SE, + SF, + SG, + SH, + SI, + SJ, + SK, + SL, + SM, + SN, + SO, + SR, + SS, + ST, + SU, + SV, + SX, + SY, + SZ, + TA, + TC, + TD, + TF, + TG, + TJ, + TK, + TL, + TM, + TN, + TO, + TP, + TR, + TT, + TV, + TW, + TZ, + UA, + UG, + UK, + UM, + US, + UY, + UZ, + VA, + VC, + VE, + VG, + VI, + VN, + VU, + WF, + WS, + XK, + YE, + YT, + YU, + ZA, + ZM, + ZR, + ZW, +} +enum Leistungstyp { + ARBEITSPREIS_WIRKARBEIT, + LEISTUNGSPREIS_WIRKLEISTUNG, + ARBEITSPREIS_BLINDARBEIT_IND, + ARBEITSPREIS_BLINDARBEIT_KAP, + GRUNDPREIS, + MEHRMINDERMENGE, + MESSSTELLENBETRIEB, + MESSDIENSTLEISTUNG, + MESSDIENSTLEISTUNG_INKL_MESSUNG, + ABRECHNUNG, + KONZESSIONS_ABGABE, + KWK_UMLAGE, + OFFSHORE_UMLAGE, + ABLAV_UMLAGE, + REGELENERGIE_UMLAGE, + BILANZIERUNG_UMLAGE, + AUSLESUNG_ZUSAETZLICH, + ABLESUNG_ZUSAETZLICH, + ABRECHNUNG_ZUSAETZLICH, + SPERRUNG, + ENTSPERRUNG, + MAHNKOSTEN, + INKASSOKOSTEN, +} +enum Lokationstyp { + MaLo, + MeLo, +} +enum Marktrolle { + NB, + LF, + MSB, + MDL, + DL, + BKV, + BIKO, + UENB, + KUNDE_SELBST_NN, + MGV, + EIV, + RB, + KUNDE, + INTERESSENT, +} +enum Mengeneinheit { + WH= 2, + KW= 3, + KWH= 1000 * WH, + MW= 1000 * KW, + MWH= 1000 * KWH, + ANZAHL= 7, + KUBIKMETER= 11, + STUNDE= 13, + TAG= 17, + MONAT= 19, + JAHR= 12 * MONAT, + VAR= 23, + KVAR= 1000 * VAR, + VARH= 29, + KVARH= 1000 * VARH, +} +enum Mengenoperator { + KLEINER_ALS, + GROESSER_ALS, + GLEICH, +} +enum Messpreistyp { + MESSPREIS_G4, + MESSPREIS_G6, + MESSPREIS_G10, + MESSPREIS_G16, + MESSPREIS_G25, + MESSPREIS_G40, + ELEKTRONISCHER_AUFSATZ, + SMART_METER_MESSPREIS_G2_5, + SMART_METER_MESSPREIS_G4, + SMART_METER_MESSPREIS_G6, + SMART_METER_MESSPREIS_G10, + SMART_METER_MESSPREIS_G16, + SMART_METER_MESSPREIS_G25, + SMART_METER_MESSPREIS_G40, + VERRECHNUNGSPREIS_ET_WECHSEL, + VERRECHNUNGSPREIS_ET_DREH, + VERRECHNUNGSPREIS_ZT_WECHSEL, + VERRECHNUNGSPREIS_ZT_DREH, + VERRECHNUNGSPREIS_L_ET, + VERRECHNUNGSPREIS_L_ZT, + VERRECHNUNGSPREIS_SM, + AUFSCHLAG_WANDLER, + AUFSCHLAG_TARIFSCHALTUNG, +} +enum Messwerterfassung { + FERNAUSLESBAR, + MANUELL_AUSGELESENE, +} +enum Netzebene { + NSP, + MSP, + HSP, + HSS, + MSP_NSP_UMSP, + HSP_MSP_UMSP, + HSS_HSP_UMSP, + HD, + MD, + ND, +} +enum Netznutzungsabrechnungsgrundlage { + LIEFERSCHEIN, + ABWEICHENDE_GRUNDLAGE, +} +enum Netznutzungsabrechnungsvariante { + ARBEITSPREIS_GRUNDPREIS, + ARBEITSPREIS_LEISTUNGSPREIS, +} +enum NetznutzungsVertrag { + KUNDEN_NB, + LIEFERANTEN_NB, +} +enum Netznutzungszahler { + KUNDE, + LIEFERANT, +} +enum NNRechnungsart { + SELBSTAUSGESTELLT, +} +enum NNRechnungstyp { + ABSCHLAGSRECHNUNG, + TURNUSRECHNUNG, + MONATSRECHNUNG, + WIMRECHNUNG, + ZWISCHENRECHNUNG, + INTEGRIERTE_13TE_RECHNUNG, + _13TE_RECHNUNG, + MEHRMINDERMENGENRECHNUNG, +} +enum Oekolabel { + GASGREEN_GRUENER_STROM, + GASGREEN, + GRUENER_STROM_GOLD, + GRUENER_STROM_SILBER, + GRUENER_STROM, + GRUENES_GAS, + NATURWATT_STROM, + OK_POWER, + RENEWABLE_PLUS, + WATERGREEN, + WATERGREEN_PLUS, +} +enum Oekozertifikat { + CMS_EE02, + EECS, + FRAUNHOFER, + BET, + KLIMA_INVEST, + LGA, + FREIBERG, + RECS, + REGS_EGL, + TUEV, + TUEV_HESSEN, + TUEV_NORD, + TUEV_RHEINLAND, + TUEV_SUED, + TUEV_SUED_EE01, + TUEV_SUED_EE02, +} +enum Preisgarantietyp { + ALLE_PREISBESTANDTEILE_NETTO, + PREISBESTANDTEILE_OHNE_ABGABEN, + NUR_ENERGIEPREIS, +} +enum Preismodell { + TRANCHE, +} +enum Preisstatus { + VORLAEUFIG, + ENDGUELTIG, +} +enum Preistyp { + ARBEITSPREIS_EINTARIF, + ARBEITSPREIS_HT, + ARBEITSPREIS_NT, + LEISTUNGSPREIS, + MESSPREIS, + ENTGELT_ABLESUNG, + ENTGELT_ABRECHNUNG, + ENTGELT_MSB, + PROVISION, +} +enum Prioritaet { + SEHR_NIEDRIG, + NIEDRIG, + NORMAL, + HOCH, + SEHR_HOCH, +} +enum Rechnungslegung { + MONATSRECHN, + ABSCHL_MONATSRECHN, + ABSCHL_JAHRESRECHN, + MONATSRECHN_JAHRESRECHN, + VORKASSE, +} +enum RechnungspositionsStatus { + ROH= 0, + ROH_AUSGENOMMEN= 1, + ABRECHENBAR= 2, + ABRECHENBAR_AUSGENOMMEN= 3, + ABGERECHNET= 4, +} +enum Rechnungsstatus { + GEPRUEFT_OK, + GEPRUEFT_FEHLERHAFT, + GEBUCHT, + BEZAHLT, +} +enum Rechnungstyp { + ABSCHLAGSRECHNUNG, + TURNUSRECHNUNG, + MONATSRECHNUNG, + WIMRECHNUNG, + ZWISCHENRECHNUNG, + INTEGRIERTE_13TE_RECHNUNG, + ZUSAETZLICHE_13TE_RECHNUNG, + MEHRMINDERMENGENRECHNUNG, +} +enum Regionskriteriumtyp { + BUNDESLANDKENNZIFFER, + BUNDESLAND_NAME, + MARKTGEBIET_NUMMER, + MARKTGEBIET_NAME, + REGELGEBIET_NUMMER, + REGELGEBIET_NAME, + NETZBETREIBER_NUMMER, + NETZBETREIBER_NAME, + BILANZIERUNGS_GEBIET_NUMMER, + MSB_NUMMER, + MSB_NAME, + VERSORGER_NUMMER, + VERSORGER_NAME, + GRUNDVERSORGER_NUMMER, + GRUNDVERSORGER_NAME, + KREIS_NAME, + KREISKENNZIFFER, + GEMEINDE_NAME, + GEMEINDEKENNZIFFER, + POSTLEITZAHL, + ORT, + EINWOHNERZAHL_GEMEINDE, + EINWOHNERZAHL_ORT, + KM_UMKREIS, + BUNDESWEIT, +} +enum Rollencodetyp { + BDEW, + DVGW, + GLN, +} +enum Rufnummernart { + RUF_ZENTRALE, + FAX_ZENTRALE, + SAMMELRUF, + SAMMELFAX, + ABTEILUNGRUF, + ABTEILUNGFAX, + RUF_DURCHWAHL, + FAX_DURCHWAHL, + MOBIL_NUMMER, +} +enum Schwachlastfaehig { + NICHT_SCHWACHLASTFAEHIG, + SCHWACHLASTFAEHIG, +} +enum Servicetyp { + STROM_NB, + STROM_MSB, + STROM_LIEF, + GAS_NB, + GAS_MSB, + GAS_LIEF, +} +enum Sparte { + STROM, + GAS, + FERNWAERME, + NAHWAERME, + WASSER, + ABWASSER, +} +enum Steuerkennzeichen { + UST_19, + UST_7, + VST_0, + VST_19, + VST_7, + RCV, +} +enum Tarifart { + EINTARIF, + ZWEITARIF, + MEHRTARIF, + SMART_METER, + LEISTUNGSGEMESSEN, +} +enum Tarifkalkulationsmethode { + STAFFELN, + ZONEN, + BESTABRECHNUNG_STAFFEL, + PAKETPREIS, +} +enum Tarifmerkmal { + VORKASSE, + PAKET, + KOMBI, + FESTPREIS, + BAUSTROM, + HAUSLICHT, + HEIZSTROM, +} +enum Tarifregionskriterium { + NETZ_NUMMER, + POSTLEITZAHL, + ORT, + GRUNDVERSORGER_NUMMER, +} +enum Tariftyp { + GRUND_ERSATZVERSORGUNG, + GRUNDVERSORGUNG, + ERSATZVERSORGUNG, + SONDERTARIF, +} +enum Tarifzeit { + TZ_STANDARD, + TZ_HT, + TZ_NT, +} +enum Themengebiet { + ALLGEMEINER_INFORMATIONSAUSTAUSCH, + AN_UND_ABMELDUNG, + ANSPRECHPARTNER_ALLGEMEIN, + ANSPRECHPARTNER_BDEW_DVGW, + ANSPRECHPARTNER_IT_TECHNIK, + BILANZIERUNG, + BILANZKREISKOORDINATOR, + BILANZKREISVERANTWORTLICHER, + DATENFORMATE_ZERTIFIKATE_VERSCHLUESSELUNGEN, + DEBITORENMANAGEMENT, + DEMAND_SIDE_MANAGEMENT, + EDI_VEREINBARUNG, + EDIFACT, + ENERGIEDATENMANAGEMENT, + FAHRPLANMANAGEMENT, + ALOCAT, + APERAK, + CONTRL, + INVOIC, + MSCONS, + ORDERS, + ORDERSP, + REMADV, + UTILMD, + GABI, + GELI, + GERAETERUECKGABE, + GERAETEWECHSEL, + GPKE, + INBETRIEBNAHME, + KAPAZITAETSMANAGEMENT, + KLAERFAELLE, + LASTGAENGE_RLM, + LIEFERANTENRAHMENVERTRAG, + LIEFERANTENWECHSEL, + MABIS, + MAHNWESEN, + MARKTGEBIETSVERANTWORTLICHER, + MARKTKOMMUNIKATION, + MEHR_MINDERMENGEN, + MSB_MDL, + NETZABRECHNUNG, + NETZENTGELTE, + NETZMANAGEMENT, + RECHT, + REGULIERUNGSMANAGEMENT, + REKLAMATIONEN, + SPERREN_ENTSPERREN_INKASSO, + STAMMDATEN, + STOERUNGSFAELLE, + TECHNISCHE_FRAGEN, + UMSTELLUNG_INVOIC, + VERSCHLUESSELUNG_SIGNATUR, + VERTRAGSMANAGEMENT, + VERTRIEB, + WIM, + ZAEHLERSTAENDE_SLP, + ZAHLUNGSVERKEHR, + ZUORDNUNGSVEREINBARUNG, +} +enum Titel { + DR, + PROF, + PROF_DR, +} +enum Unterbrechbarkeit { + UV, + NUV, +} +enum Verbrauchsart { + KL, + KLW, + KLWS, + W, + WS, +} +enum Verbrauchsmengetyp { + ARBEITLEISTUNGTAGESPARAMETERABHMALO, + VERANSCHLAGTEJAHRESMENGE, + TUMKUNDENWERT, +} +enum Vertragsart { + ENERGIELIEFERVERTRAG, + NETZNUTZUNGSVERTRAG, + BILANZIERUNGSVERTRAG, + MESSSTELLENBETRIEBSVERTRAG, + BUENDELVERTRAG, +} +enum Vertragsform { + ONLINE, + DIREKT, + FAX, +} +enum Vertragstatus { + IN_ARBEIT, + UEBERMITTELT, + ANGENOMMEN, + AKTIV, + ABGELEHNT, + WIDERRUFEN, + STORNIERT, + GEKUENDIGT, + BEENDET, +} +enum Verwendungszweck { + NETZNUTZUNGSABRECHNUNG, + BILANZKREISABRECHNUNG, + MEHRMINDERMBENGENABRECHNUNG, + ENDKUNDENABRECHNUNG, +} +enum Voraussetzungen { + EINZUGSERMAECHTIGUNG, + ZEITPUNKT, + LIEFERANBINDUNG_EINE, + LIEFERANBINDUNG_ALLE, + GEWERBE, + LASTPROFIL, + ZAEHLERTYP_GROESSE, + AUSSCHLUSS_GROSSVERBRAUCHER, + NEUKUNDE, + BESTIMMTE_VERTRAGSFORMALITAETEN, + SELBSTABLESUNG, + ONLINEVORAUSSETZUNG, + MINDESTUMSATZ, + ZUSATZPRODUKT, + NEUKUNDE_MIT_VORAUSSETZUNGEN, + DIREKTVERTRIEB, + ANSCHLUSSART, + ANSCHLUSSWERT, + ALTER_KUNDENANLAGE, + ANLAGEBESCHAFFENHEIT, + BETRIEBSSTUNDENBEGRENZUNG, + FREIGABEZEITEN, + FAMILIENSTRUKTUR, + MITGLIEDSCHAFT, + STAATLICHE_FOERDERUNG, + BESONDERE_VERBRAUCHSSTELLE, + NIEDRIGENERGIE, + ORTSTEILE_LIEFERGEBIET, + WAERMEBEDARF_ERDGAS, + MAX_ZAEHLER_LIEFERSTELLEN, + LIEFERUNGSBESCHRAENKUNG_GASART, + KOMBI_BONI, + ALTVERTRAG, + VORGESCHRIEBENE_ZUSATZANLAGE, + MEHRERE_ZAEHLER_ABNAHMESTELLEN, + BESTIMMTER_ABNAHMEFALL, + ZUSATZMODALITAET, + NACHWEIS_ZAHLUNGSFAEHIGKEIT, + UMSTELLUNG_ENERGIEART, +} +enum Waehrungscode { + AFN, + ALL, + AMD, + ANG, + AOA, + ARS, + AUD, + AWG, + AZN, + BAM, + BBD, + BDT, + BGN, + BHD, + BIF, + BMD, + BND, + BOB, + BOV, + BRL, + BSD, + BTN, + BWP, + BYN, + BYR, + BZD, + CAD, + CDF, + CHE, + CHF, + CHW, + CLF, + CLP, + CNY, + COP, + COU, + CRC, + CUC, + CUP, + CVE, + CZK, + DJF, + DKK, + DOP, + DZD, + EGP, + ERN, + ETB, + EUR, + FJD, + FKP, + GBP, + GEL, + GHS, + GIP, + GMD, + GNF, + GTQ, + GYD, + HKD, + HNL, + HRK, + HTG, + HUF, + IDR, + ILS, + INR, + IQD, + IRR, + ISK, + JMD, + JOD, + JPY, + KES, + KGS, + KHR, + KMF, + KPW, + KRW, + KWD, + KYD, + KZT, + LAK, + LBP, + LKR, + LRD, + LSL, + LTL, + LYD, + MAD, + MDL, + MGA, + MKD, + MMK, + MNT, + MOP, + MRO, + MUR, + MVR, + MWK, + MXN, + MXV, + MYR, + MZN, + NAD, + NGN, + NIO, + NOK, + NPR, + NZD, + OMR, + PAB, + PEN, + PGK, + PHP, + PKR, + PLN, + PYG, + QAR, + RON, + RSD, + RUB, + RUR, + RWF, + SAR, + SBD, + SCR, + SDG, + SEK, + SGD, + SHP, + SLL, + SOS, + SRD, + SSP, + STD, + SVC, + SYP, + SZL, + THB, + TJS, + TMT, + TND, + TOP, + TRY, + TTD, + TWD, + TZS, + UAH, + UGX, + USD, + USN, + USS, + UYI, + UYU, + UZS, + VEF, + VND, + VUV, + WST, + XAF, + XAG, + XAU, + XBA, + XBB, + XBC, + XBD, + XCD, + XDR, + XOF, + XPD, + XPF, + XPT, + XSU, + XTS, + XUA, + XXX, + YER, + ZAR, + ZMW, + ZWL, +} +enum Waehrungseinheit { + EUR, + CT, +} +enum Waermenutzung { + SPEICHERHEIZUNG, + WAERMEPUMPE, + DIREKTHEIZUNG, +} +enum Wertermittlungsverfahren { + PROGNOSE, + MESSUNG, +} +enum Zaehlerauspraegung { + EINRICHTUNGSZAEHLER, + ZWEIRICHTUNGSZAEHLER, +} +enum Zaehlertyp { + DREHSTROMZAEHLER, + BALGENGASZAEHLER, + DREHKOLBENZAEHLER, + SMARTMETER, + LEISTUNGSZAEHLER, + MAXIMUMZAEHLER, + TURBINENRADGASZAEHLER, + ULTRASCHALLGASZAEHLER, + WECHSELSTROMZAEHLER, +} +enum Zeiteinheit { + SEKUNDE, + MINUTE, + STUNDE, + VIERTEL_STUNDE, + TAG, + WOCHE, + MONAT, + QUARTAL, + HALBJAHR, + JAHR, +} +enum Zeitreihentyp { + EGS, + LGS, + NZR, + SES, + SLS, + TES, + TLS, +} +class Bo4eUri { + + Bo4eUri(uri:string) + + GetBoName() : string + + GetBoType() : Type + + {static} FullyUnescapeDataString(stringToUnescape:string) : string + + {static} IsValid(uri:string) : bool + + {static} GetUri(bo:BusinessObject, includeUserProperties:bool) : Bo4eUri + + GetQueryObject(boType:Type, i:int) : JObject + + AddFilter(filterObject:IDictionary) : Bo4eUri +} +class StringUriConverter { + + <> CanConvertFrom(context:ITypeDescriptorContext, sourceType:Type) : bool + + <> ConvertFrom(context:ITypeDescriptorContext, culture:CultureInfo, value:object) : object +} +Uri <|-- Bo4eUri +TypeConverter <|-- StringUriConverter +class BoKey { + + IgnoreInheritedKeys : bool <> + + BoKey(ignoreInheritedKeys:bool) +} +Attribute <|-- BoKey +enum DataCategory { + ADDRESS, + DEVICE, + FINANCE, + LEGAL, + NAME, + METER_READING, + POD, + USER_PROPERTIES, +} +class DataCategoryAttribute { + + DataCategoryAttribute(enums:object[]) +} +class "HashSet`1" { +} +Attribute <|-- DataCategoryAttribute +DataCategoryAttribute --> "Mapping" "HashSet`1" +class FieldName { + + text : string <> + + FieldName(text:string, language:Language) +} +Attribute <|-- FieldName +FieldName --> "language" Language +enum Language { + EN, + DE, + FR, + SP, +} +class MappingAttribute { + + MappingAttribute(enums:object[]) +} +class "List`1" { +} +Attribute <|-- MappingAttribute +MappingAttribute --> "Mapping" "List`1" +class MultiLangResolver { + + MultiLangResolver(lang:Language) +} +DefaultContractResolver <|-- MultiLangResolver +class NonOfficialAttribute { + + NonOfficialAttribute(enums:object[]) + + HasCategory(noc:NonOfficialCategory) : bool +} +Attribute <|-- NonOfficialAttribute +enum NonOfficialCategory { + UNSPECIFIED, + MISSING, + REGULATORY_REQUIREMENTS, + PROPOSED_DELETION, + CUSTOMER_REQUIREMENTS, +} +class LogObject { + + Id : string <> <> + + LogMessage : string <> <> +} +BusinessObject <|-- LogObject +LogObject --> "Datetime" DateTime +enum BDEWArtikelnummerEdi { + _9990001000053, + _9990001000079, + _9990001000087, + _9990001000128, + _9990001000136, + _9990001000144, + _9990001000152, + _9990001000160, + _9990001000178, + _9990001000186, + _9990001000219, + _9990001000269, + _9990001000285, + _9990001000334, + _9990001000376, + _9990001000417, + _9990001000433, + _9990001000475, + _9990001000508, + _9990001000532, + _9990001000540, + _9990001000558, + _9990001000566, + _9990001000574, + _9990001000582, + _9990001000590, + _9990001000615, + _9990001000623, + _9990001000631, + _9990001000649, + _9990001000657, + _9990001000665, + _9990001000673, + _9990001000681, + _9990001000699, + _9990001000706, + _9990001000714, + _9990001000722, + _9990001000730, + _9990001000748, + _9990001000756, + _9990001000764, + _9990001000772, + _9990001000780, + _9990001000798, +} +enum EnergierichtungEdi { + Z06, + Z07, +} +enum FernschaltungEdi { + Z06, + Z07, +} +enum GeraetetypEdi { + AHZ, + WSZ, + LAZ, + MAZ, + MME, + DKZ, + BGZ, + TRZ, + UGZ, + WGZ, + MRG, + EHZ, + IVA, +} +enum GeschaeftspartnerrolleEdi { + SU, + DEB, + UD, + MS, + MR, + VY, +} +enum KontaktartEdi { + EM, + FX, + TE, + AJ, + AL, +} +enum MesswerterfassungEdi { + AMR, + MMR, +} +enum NetzebeneEdi { + E03, + E04, + E05, + E06, + E07, + E08, + E09, + Y01, + Y02, + Y03, +} +enum NetznutzungsabrechnungsgrundlageEdi { + Z12, + Z13, +} +enum NetznutzungsabrechnungsvarianteEdi { + Z14, + Z15, +} +enum NetznutzungsvertragEdi { + Z08, + Z09, +} +enum NetznutzungszahlerEdi { + Z10, + Z11, +} +enum RollencodetypEdi { + _293, + _332, +} +enum SchwachlastfaehigEdi { + Z59, + Z60, +} +enum TarifartEdi { + ETZ, + ZTZ, + NTZ, +} +enum UnterbrechbarkeitEdi { + Unterbrechbare_Verbrauchseinrichtung, + Nicht_Unterbrechbare_Verbrauchseinrichtung, +} +enum VerbrauchsartEdi { + Z64, + Z65, + Z66, +} +enum VerwendungszweckEdi { + Z84, + Z85, + Z86, + Z47, +} +enum WaehrungseinheitEdi { + EUR, +} +enum WaermenutzungEdi { + Z56, + Z57, + Z61, +} +enum WertermittlungsverfahrenEdi { + _220, + _67, + _201, + _20, +} +enum ZaehlerauspraegungEdi { + ERZ, + ZRZ, +} +enum ZaehlertypEdi { + AHZ, + WSZ, + LAZ, + MAZ, + MME, + DKZ, + BGZ, + TRZ, + UGZ, + WGZ, + MRG, + EHZ, + IVA, +} +enum ZeiteinheitEdi { + ANN, +} +class LenientBo4eUriConverter { + + <> CanConvert(objectType:Type) : bool + + <> ReadJson(reader:JsonReader, objectType:Type, existingValue:object, serializer:JsonSerializer) : object + + <> CanWrite : bool <> + + <> WriteJson(writer:JsonWriter, value:object, serializer:JsonSerializer) : void +} +JsonConverter <|-- LenientBo4eUriConverter +class LenientDateTimeConverter { + + LenientDateTimeConverter(defaultDateTime:DateTime?) + + LenientDateTimeConverter() + + <> CanConvert(objectType:Type) : bool + + <> ReadJson(reader:JsonReader, objectType:Type, existingValue:object, serializer:JsonSerializer) : object + + <> CanWrite : bool <> + + <> WriteJson(writer:JsonWriter, value:object, serializer:JsonSerializer) : void +} +JsonConverter <|-- LenientDateTimeConverter +class LenientEnumListConverter { + + <> CanConvert(objectType:Type) : bool + + <> ReadJson(reader:JsonReader, objectType:Type, existingValue:object, serializer:JsonSerializer) : object + + <> CanWrite : bool <> + + <> WriteJson(writer:JsonWriter, value:object, serializer:JsonSerializer) : void +} +JsonConverter <|-- LenientEnumListConverter +class LenientParsingExtensions <> { + + {static} GetJsonSerializerSettings(lenient:LenientParsing) : JsonSerializerSettings + + {static} GetJsonSerializerSettings(lenient:LenientParsing, userPropertiesWhiteList:HashSet) : JsonSerializerSettings +} +enum LenientParsing { + Strict= 0, + DateTime= 1, + EnumList= 2, + Bo4eUri= 4, + SetInitialDateIfNull= 8, + StringToInt= 16, + MOST_LENIENT= ~0, +} +class LenientStringToIntConverter { + + <> CanConvert(objectType:Type) : bool + + <> ReadJson(reader:JsonReader, objectType:Type, existingValue:object, serializer:JsonSerializer) : object + + <> CanWrite : bool <> + + <> WriteJson(writer:JsonWriter, value:object, serializer:JsonSerializer) : void +} +JsonConverter <|-- LenientStringToIntConverter +enum UTILMD9013 { + E01, + E02, + E03, + E05, + E06, + E11, + E15, + E17, + Z01, + Z09, + Z15, + Z26, + Z29, + Z33, + Z37, + Z38, + Z39, + Z40, + Z41, + Z44, + Z69, + ZB2, + ZB3, + ZB6, + ZC6, + ZC7, + ZC8, + ZG9, + ZH0, + ZH1, + ZH2, + ZD0, + ZD9, + ZE3, + ZE4, + ZE5, + ZE6, + ZE7, + ZE8, + ZE9, + ZF0, + ZF1, + ZF2, + ZF3, + ZF4, + ZF5, + ZF6, + ZF7, + ZF8, + ZG5, + ZG6, + ZG7, + ZG8, + ZI8, + ZI9, + ZJ0, + ZJ1, + ZJ4, +} +enum UTILMD7433 { + Z04, + Z06, +} +@enduml diff --git a/puml-files/meta/Bo4eUri.puml b/puml-files/meta/Bo4eUri.puml new file mode 100644 index 00000000..0f17e984 --- /dev/null +++ b/puml-files/meta/Bo4eUri.puml @@ -0,0 +1,18 @@ +@startuml +class Bo4eUri { + + Bo4eUri(uri:string) + + GetBoName() : string + + GetBoType() : Type + + {static} FullyUnescapeDataString(stringToUnescape:string) : string + + {static} IsValid(uri:string) : bool + + {static} GetUri(bo:BusinessObject, includeUserProperties:bool) : Bo4eUri + + GetQueryObject(boType:Type, i:int) : JObject + + AddFilter(filterObject:IDictionary) : Bo4eUri +} +class StringUriConverter { + + <> CanConvertFrom(context:ITypeDescriptorContext, sourceType:Type) : bool + + <> ConvertFrom(context:ITypeDescriptorContext, culture:CultureInfo, value:object) : object +} +Uri <|-- Bo4eUri +TypeConverter <|-- StringUriConverter +@enduml diff --git a/puml-files/meta/BoKey.puml b/puml-files/meta/BoKey.puml new file mode 100644 index 00000000..4de5eb9c --- /dev/null +++ b/puml-files/meta/BoKey.puml @@ -0,0 +1,7 @@ +@startuml +class BoKey { + + IgnoreInheritedKeys : bool <> + + BoKey(ignoreInheritedKeys:bool) +} +Attribute <|-- BoKey +@enduml diff --git a/puml-files/meta/DataCategory.puml b/puml-files/meta/DataCategory.puml new file mode 100644 index 00000000..5844b5c0 --- /dev/null +++ b/puml-files/meta/DataCategory.puml @@ -0,0 +1,12 @@ +@startuml +enum DataCategory { + ADDRESS, + DEVICE, + FINANCE, + LEGAL, + NAME, + METER_READING, + POD, + USER_PROPERTIES, +} +@enduml diff --git a/puml-files/meta/DataCategoryAttribute.puml b/puml-files/meta/DataCategoryAttribute.puml new file mode 100644 index 00000000..75ada13c --- /dev/null +++ b/puml-files/meta/DataCategoryAttribute.puml @@ -0,0 +1,9 @@ +@startuml +class DataCategoryAttribute { + + DataCategoryAttribute(enums:object[]) +} +class "HashSet`1" { +} +Attribute <|-- DataCategoryAttribute +DataCategoryAttribute --> "Mapping" "HashSet`1" +@enduml diff --git a/puml-files/meta/FieldName.puml b/puml-files/meta/FieldName.puml new file mode 100644 index 00000000..c118a464 --- /dev/null +++ b/puml-files/meta/FieldName.puml @@ -0,0 +1,8 @@ +@startuml +class FieldName { + + text : string <> + + FieldName(text:string, language:Language) +} +Attribute <|-- FieldName +FieldName --> "language" Language +@enduml diff --git a/puml-files/meta/Language.puml b/puml-files/meta/Language.puml new file mode 100644 index 00000000..8783a2f6 --- /dev/null +++ b/puml-files/meta/Language.puml @@ -0,0 +1,8 @@ +@startuml +enum Language { + EN, + DE, + FR, + SP, +} +@enduml diff --git a/puml-files/meta/LenientConverters/LenientBo4eUriConverter.puml b/puml-files/meta/LenientConverters/LenientBo4eUriConverter.puml new file mode 100644 index 00000000..fac86ce9 --- /dev/null +++ b/puml-files/meta/LenientConverters/LenientBo4eUriConverter.puml @@ -0,0 +1,9 @@ +@startuml +class LenientBo4eUriConverter { + + <> CanConvert(objectType:Type) : bool + + <> ReadJson(reader:JsonReader, objectType:Type, existingValue:object, serializer:JsonSerializer) : object + + <> CanWrite : bool <> + + <> WriteJson(writer:JsonWriter, value:object, serializer:JsonSerializer) : void +} +JsonConverter <|-- LenientBo4eUriConverter +@enduml diff --git a/puml-files/meta/LenientConverters/LenientDateTimeConverter.puml b/puml-files/meta/LenientConverters/LenientDateTimeConverter.puml new file mode 100644 index 00000000..a952ed96 --- /dev/null +++ b/puml-files/meta/LenientConverters/LenientDateTimeConverter.puml @@ -0,0 +1,11 @@ +@startuml +class LenientDateTimeConverter { + + LenientDateTimeConverter(defaultDateTime:DateTime?) + + LenientDateTimeConverter() + + <> CanConvert(objectType:Type) : bool + + <> ReadJson(reader:JsonReader, objectType:Type, existingValue:object, serializer:JsonSerializer) : object + + <> CanWrite : bool <> + + <> WriteJson(writer:JsonWriter, value:object, serializer:JsonSerializer) : void +} +JsonConverter <|-- LenientDateTimeConverter +@enduml diff --git a/puml-files/meta/LenientConverters/LenientEnumListConverter.puml b/puml-files/meta/LenientConverters/LenientEnumListConverter.puml new file mode 100644 index 00000000..9d94ea00 --- /dev/null +++ b/puml-files/meta/LenientConverters/LenientEnumListConverter.puml @@ -0,0 +1,9 @@ +@startuml +class LenientEnumListConverter { + + <> CanConvert(objectType:Type) : bool + + <> ReadJson(reader:JsonReader, objectType:Type, existingValue:object, serializer:JsonSerializer) : object + + <> CanWrite : bool <> + + <> WriteJson(writer:JsonWriter, value:object, serializer:JsonSerializer) : void +} +JsonConverter <|-- LenientEnumListConverter +@enduml diff --git a/puml-files/meta/LenientConverters/LenientJsonSerializerSettingsGenerator.puml b/puml-files/meta/LenientConverters/LenientJsonSerializerSettingsGenerator.puml new file mode 100644 index 00000000..70462a38 --- /dev/null +++ b/puml-files/meta/LenientConverters/LenientJsonSerializerSettingsGenerator.puml @@ -0,0 +1,6 @@ +@startuml +class LenientParsingExtensions <> { + + {static} GetJsonSerializerSettings(lenient:LenientParsing) : JsonSerializerSettings + + {static} GetJsonSerializerSettings(lenient:LenientParsing, userPropertiesWhiteList:HashSet) : JsonSerializerSettings +} +@enduml diff --git a/puml-files/meta/LenientConverters/LenientParsing.puml b/puml-files/meta/LenientConverters/LenientParsing.puml new file mode 100644 index 00000000..9db2b2b8 --- /dev/null +++ b/puml-files/meta/LenientConverters/LenientParsing.puml @@ -0,0 +1,11 @@ +@startuml +enum LenientParsing { + Strict= 0, + DateTime= 1, + EnumList= 2, + Bo4eUri= 4, + SetInitialDateIfNull= 8, + StringToInt= 16, + MOST_LENIENT= ~0, +} +@enduml diff --git a/puml-files/meta/LenientConverters/LenientStringToIntConverter.puml b/puml-files/meta/LenientConverters/LenientStringToIntConverter.puml new file mode 100644 index 00000000..e2533576 --- /dev/null +++ b/puml-files/meta/LenientConverters/LenientStringToIntConverter.puml @@ -0,0 +1,9 @@ +@startuml +class LenientStringToIntConverter { + + <> CanConvert(objectType:Type) : bool + + <> ReadJson(reader:JsonReader, objectType:Type, existingValue:object, serializer:JsonSerializer) : object + + <> CanWrite : bool <> + + <> WriteJson(writer:JsonWriter, value:object, serializer:JsonSerializer) : void +} +JsonConverter <|-- LenientStringToIntConverter +@enduml diff --git a/puml-files/meta/MappingAttribute.puml b/puml-files/meta/MappingAttribute.puml new file mode 100644 index 00000000..1aaa17e6 --- /dev/null +++ b/puml-files/meta/MappingAttribute.puml @@ -0,0 +1,9 @@ +@startuml +class MappingAttribute { + + MappingAttribute(enums:object[]) +} +class "List`1" { +} +Attribute <|-- MappingAttribute +MappingAttribute --> "Mapping" "List`1" +@enduml diff --git a/puml-files/meta/MultiLangResolver.puml b/puml-files/meta/MultiLangResolver.puml new file mode 100644 index 00000000..b305d124 --- /dev/null +++ b/puml-files/meta/MultiLangResolver.puml @@ -0,0 +1,6 @@ +@startuml +class MultiLangResolver { + + MultiLangResolver(lang:Language) +} +DefaultContractResolver <|-- MultiLangResolver +@enduml diff --git a/puml-files/meta/NonOfficialAttribute.puml b/puml-files/meta/NonOfficialAttribute.puml new file mode 100644 index 00000000..81a8c933 --- /dev/null +++ b/puml-files/meta/NonOfficialAttribute.puml @@ -0,0 +1,7 @@ +@startuml +class NonOfficialAttribute { + + NonOfficialAttribute(enums:object[]) + + HasCategory(noc:NonOfficialCategory) : bool +} +Attribute <|-- NonOfficialAttribute +@enduml diff --git a/puml-files/meta/NonOfficialCategory.puml b/puml-files/meta/NonOfficialCategory.puml new file mode 100644 index 00000000..b02d175e --- /dev/null +++ b/puml-files/meta/NonOfficialCategory.puml @@ -0,0 +1,9 @@ +@startuml +enum NonOfficialCategory { + UNSPECIFIED, + MISSING, + REGULATORY_REQUIREMENTS, + PROPOSED_DELETION, + CUSTOMER_REQUIREMENTS, +} +@enduml