diff --git a/BeWo/Converter/ValidationConverter.cs b/BeWo/Converter/ValidationConverter.cs index 6ee6613a2..37f55b2e2 100644 --- a/BeWo/Converter/ValidationConverter.cs +++ b/BeWo/Converter/ValidationConverter.cs @@ -18,7 +18,7 @@ namespace BeWo.Converter { if(value is string val_str && parameter is ValidationType val_type) { - return Validator.IsValid(val_type, val_str); + return GkvValidator.IsValid(val_type, val_str); } return null; diff --git a/BeWo/Converter/ValidationToTooltipConverter.cs b/BeWo/Converter/ValidationToTooltipConverter.cs index 1aa37ac78..50a9d77b4 100644 --- a/BeWo/Converter/ValidationToTooltipConverter.cs +++ b/BeWo/Converter/ValidationToTooltipConverter.cs @@ -22,7 +22,7 @@ namespace BeWo.Converter if (value is bool val_bool && parameter is ValidationType val_type) { - return val_bool ? null : Validator.InvalidTooltipTxt(val_type); + return val_bool ? null : GkvValidator.InvalidTooltipTxt(val_type); } return "xxx"; diff --git a/BeWo/ViewModel/OrganisationVM.cs b/BeWo/ViewModel/OrganisationVM.cs index bd5785db1..5289a71a8 100644 --- a/BeWo/ViewModel/OrganisationVM.cs +++ b/BeWo/ViewModel/OrganisationVM.cs @@ -713,8 +713,8 @@ namespace BeWo.ViewModel } public bool IsIKNumberValid - => Validator.IsIKNumberValid(IKKrankenkasse) - && Validator.IsLeistungserbringergruppeValid(Leistungserbringergruppe); + => GkvValidator.IsIKNumberValid(IKKrankenkasse) + && GkvValidator.IsLeistungserbringergruppeValid(Leistungserbringergruppe); public string IKKrankenkasse { diff --git a/Service/DCEntityMapper/GkvAbrechnungDC_GkvAbrechnung.cs b/Service/DCEntityMapper/GkvAbrechnungDC_GkvAbrechnung.cs index f0339cd64..259bc9bbd 100644 --- a/Service/DCEntityMapper/GkvAbrechnungDC_GkvAbrechnung.cs +++ b/Service/DCEntityMapper/GkvAbrechnungDC_GkvAbrechnung.cs @@ -67,7 +67,7 @@ namespace BeWo.Service.DCEntityMapper // Hole OrganisationLight var orga = DAOFactory.GenericDAO.LoadByID(orga_oid); - if (!Validator.IsOrganisationInformationValid(orga)) + if (!GkvValidator.IsOrganisationInformationValid(orga)) { isReady = false; tooltip = "Organisation ist nicht Gkv Ready"; diff --git a/Service/DCEntityMapper/InvoiceBaseDC_InvoiceBase.cs b/Service/DCEntityMapper/InvoiceBaseDC_InvoiceBase.cs index 524adb4b4..186ee1148 100644 --- a/Service/DCEntityMapper/InvoiceBaseDC_InvoiceBase.cs +++ b/Service/DCEntityMapper/InvoiceBaseDC_InvoiceBase.cs @@ -146,8 +146,12 @@ namespace BeWo.Service.DCEntityMapper pDataContract.CustomerOid = customer.Oid.Value; pDataContract.CustomerFirstName = customer.Person.FirstName; pDataContract.CustomerLastName = customer.Person.LastName; - var error = Validator.ValidateCustomer(customer.InsuranceNumber, customer.VersichertenStatus); - pDataContract.IsGkvValidError = error; + + var error = GkvValidator.ValidateCustomer(customer.InsuranceNumber, customer.VersichertenStatus); + if (error is null) + error = GkvValidator.ValidateInvoiceBase(pDataContract); + + pDataContract.IsGkvValidError = error; pDataContract.IsGkvValid = error is null; } diff --git a/Service/ServiceImplementations/CustomerServiceImp.cs b/Service/ServiceImplementations/CustomerServiceImp.cs index 44e2e6bff..e9117921d 100644 --- a/Service/ServiceImplementations/CustomerServiceImp.cs +++ b/Service/ServiceImplementations/CustomerServiceImp.cs @@ -852,7 +852,7 @@ namespace BeWo.Service.ServiceImplementations IList list = DAOFactory.GenericDAO.GetAllActiveAndArchived(); list = list.Where(x => !x.GkvAusblenden && - Validator.IsOrganisationInformationValid(x.IKDatenannahmestelle, x.IKKostentrager, x.IKKrankenkasse, x.BezDatenannahmestelle)).ToList(); + GkvValidator.IsOrganisationInformationValid(x.IKDatenannahmestelle, x.IKKostentrager, x.IKKrankenkasse, x.BezDatenannahmestelle)).ToList(); return CreateCompactOrganisations(list); } diff --git a/Service/ServiceImplementations/GkvAccountingServiceImp.cs b/Service/ServiceImplementations/GkvAccountingServiceImp.cs index ee582a6b0..a64a0ffc5 100644 --- a/Service/ServiceImplementations/GkvAccountingServiceImp.cs +++ b/Service/ServiceImplementations/GkvAccountingServiceImp.cs @@ -377,12 +377,12 @@ namespace BeWo.Service.ServiceImplementations var manager = new DakotaManager(); var mandatordc = new OperationsServiceImp().GetMandator(); - Validator.ValidateMandator(mandatordc); + GkvValidator.ValidateMandator(mandatordc); var gkvAbrechnungDC = MapperFactory.GkvAbrechnungDC_GkvAbrechnung.MapToNewDC(gkvAbrechnung); var orgadc = gkvAbrechnungDC.Organisation; - Validator.ValidateOrganisation(orgadc); + GkvValidator.ValidateOrganisation(orgadc); var datenannahmestelle = orgadc.IKDatenannahmestelle; var (datenaustauschreferenz, transfernummer) = GetNextDatenaustauschreferenzTransfernummer(gkvAbrechnung, datenannahmestelle); @@ -416,7 +416,7 @@ namespace BeWo.Service.ServiceImplementations var servicedc = MapperFactory.ServiceInvoiceDC_ServiceInvoice.MapToNewDC(service); var customerdc = MapperFactory.CustomerDC_Customer.MapToNewDC(customer); - Validator.ValidateCustomer(customerdc); + GkvValidator.ValidateCustomer(customerdc); manager.Add(servicedc, orgadc, customerdc, addressInfo, dat_short, tra_short); } diff --git a/Shared/Core/Validator.cs b/Shared/Core/GkvValidator.cs similarity index 85% rename from Shared/Core/Validator.cs rename to Shared/Core/GkvValidator.cs index 24acd3b4a..71d09dd21 100644 --- a/Shared/Core/Validator.cs +++ b/Shared/Core/GkvValidator.cs @@ -6,11 +6,12 @@ using System; using System.Collections.Generic; using System.Linq; using System.Text; +using System.Text.RegularExpressions; using System.Threading.Tasks; namespace BS.Shared.Core { - public static class Validator + public static class GkvValidator { public static bool? IsValid(ValidationType val_type, string val_str) { @@ -73,7 +74,7 @@ namespace BS.Shared.Core if (mandatordc == null) throw new GkvException("Mandator ist null"); - if (!Validator.IsIKNumberValid(mandatordc.IKLeistungserbringer)) + if (!IsIKNumberValid(mandatordc.IKLeistungserbringer)) throw new GkvException($"Die IK Nummer des Leistungserbringers \"{mandatordc.IKLeistungserbringer}\" ist ungültig."); } public static void ValidateCustomer(CustomerDC customerDC) @@ -110,16 +111,35 @@ namespace BS.Shared.Core if (error != null) throw new GkvException(error); } - public static bool IsOrganisationInformationValid(IOrganisation orga) + public static string ValidateInvoiceBases(IEnumerable invoices) + { + foreach (var invoice in invoices) + { + if (ValidateInvoiceBase(invoice) is string error) + return error; + } + + return null; + } + public static string ValidateInvoiceBase(IInvoiceBase invoice) + { + if (!IsInvoiceNumberValid(invoice.InvoiceNumber)) + return $"Rechnungsnummer \"{invoice.InvoiceNumber}\" ist ungültig"; + + return null; + } + + public static bool IsOrganisationInformationValid(IOrganisation orga) { return IsOrganisationInformationValid(orga.IKDatenannahmestelle, orga.IKKostentrager, orga.IKKrankenkasse, orga.BezDatenannahmestelle); - } - public static bool IsOrganisationInformationValid(string ik_datenannahmestelle, string ik_kostentrager, string ik_krankenkasse, string bez_datenannahmestelle) + } + public static bool IsOrganisationInformationValid(string ik_datenannahmestelle, string ik_kostentrager, string ik_krankenkasse, string bez_datenannahmestelle) => IsIKNumberValid(ik_datenannahmestelle, ik_kostentrager, ik_krankenkasse) && IsBezDatenannahmestelleValid(bez_datenannahmestelle); public static bool IsIKNumberValid(params string[] iks) => iks?.All(IsIKNumberValid) ?? false; - public static bool IsBezDatenannahmestelleValid(string bez_datenannahmestelle) + + public static bool IsBezDatenannahmestelleValid(string bez_datenannahmestelle) { return !string.IsNullOrWhiteSpace(bez_datenannahmestelle); } @@ -180,5 +200,11 @@ namespace BS.Shared.Core return true; } + public static bool IsInvoiceNumberValid(string invoiceNumber) + { + var pattern = @"^(?!.*[-/]{2})(?![-/])(?!.*[-/]$)[A-Za-z0-9]+(?:[/-][A-Za-z0-9]+)*$"; + + return Regex.IsMatch(invoiceNumber, pattern); + } } } diff --git a/Shared/Core/ValidatorExtended.cs b/Shared/Core/ValidatorExtended.cs index e8b008b28..cfa066a1d 100644 --- a/Shared/Core/ValidatorExtended.cs +++ b/Shared/Core/ValidatorExtended.cs @@ -7,6 +7,7 @@ using System; using System.Collections.Generic; using System.Linq; using System.Text; +using System.Text.RegularExpressions; using System.Threading.Tasks; namespace BS.Shared.Core @@ -23,6 +24,8 @@ namespace BS.Shared.Core error = "Unterschiedliche Rechnungspositionen"; else if (GetInvalidUnitDescription(invoiceBases) is IInvoiceItem invalid) error = $"Ungültige Rechnungsposition: {invalid.ItemDescription}:{invalid.UnitDescription}"; + else if (GetInvalidInvoiceNumber(invoiceBases) is IInvoiceBase invalid2) + error = $"Ungültige Rechnungsnummer: {invalid2.InvoiceNumber}"; if(error is string) throw new GkvException(error, "Validierung"); @@ -71,5 +74,7 @@ namespace BS.Shared.Core return null; } + + } } diff --git a/Shared/Interface/IInvoiceBase.cs b/Shared/Interface/IInvoiceBase.cs index 905442066..db3a0cc8e 100644 --- a/Shared/Interface/IInvoiceBase.cs +++ b/Shared/Interface/IInvoiceBase.cs @@ -9,6 +9,7 @@ namespace BS.Shared.Interface public interface IInvoiceBase { long? Oid { get; } + string InvoiceNumber { get; } string InvoiceTitle { get; } string InvoiceId { get; } string SenderStreet { get; } diff --git a/Shared/Shared.csproj b/Shared/Shared.csproj index 0e7be8270..4b8736e97 100644 --- a/Shared/Shared.csproj +++ b/Shared/Shared.csproj @@ -151,7 +151,7 @@ - +