using BS.Shared.Core.Rule; using BS.Shared.DataContracts; using BS.Shared.Exceptions; using BS.Shared.Extensions; using BS.Shared.Interface; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using static BS.Shared.Core.Rule.GkvRules; namespace BS.Shared.Core.Validation { public static class GkvValidation { public static string ValidateGkvAbrechnung(IGkvAbrechnung gkvAbrechnung, IEnumerable invoiceBases, bool testInvoicesEmpty = true) { if (testInvoicesEmpty && !invoiceBases.Any()) return "Keine Rechnungen gefunden"; if (ValidateInvoiceBases(invoiceBases) is string rtn_error) return rtn_error; return null; } public static string ValidateMandator(MandatorDC mandatordc) { if (mandatordc == null) return "Mandator ist null"; if (!IsIKNumberValid(mandatordc.IKLeistungserbringer)) return $"Die IK Nummer des Leistungserbringers \"{mandatordc.IKLeistungserbringer}\" ist ungültig."; if (mandatordc.Name.Length > 30) return $"Der Name des Leistungserbringers \"{mandatordc.IKLeistungserbringer}\" ist zu lang. Nach Vorgabe dürfen es maximal 30 Stellen sein."; return null; } public static string ValidateCustomer(CustomerDC customerDC) { if (customerDC == null) return "customer is null"; bool valid_number = IsVersichertennummerValid(customerDC.InsuranceNumber); bool valid_status = IsVersichertenstatusValid(customerDC.VersichertenStatus); if (!valid_number && !valid_status) return $"{Translation.Translator.Translate("Klient/in")} \"{customerDC.LastName}, {customerDC.FirstName}\" hat weder eine gültige Versichertennummer, noch einen gültigen Versichertenstatus"; if (!valid_number) return $"{Translation.Translator.Translate("Klient/in")} \"{customerDC.LastName}, {customerDC.FirstName}\" hat keine gültige Versichertennummer"; if (!valid_status) return $"{Translation.Translator.Translate("Klient/in")} \"{customerDC.LastName}, {customerDC.FirstName}\" hat keinen gültigen Versichertenstatus"; return null; } public static string ValidateCustomer(string insuranceNumber, string versichertenStatus, string customerName = null) { bool valid_number = IsVersichertennummerValid(insuranceNumber); bool valid_status = IsVersichertenstatusValid(versichertenStatus); if (!valid_number && !valid_status) return $"Versichtertennummer & -status des {Translation.Translator.Translate("Klient/in")} ungültig."; if (!valid_number) return $"Versichertennummer des {Translation.Translator.Translate("Klient/in")} ungültig"; if (!valid_status) return $"Versichertenstatus des {Translation.Translator.Translate("Klient/in")} ungültig"; return null; } public static string ValidateOrganisation(OrganisationDC orga) { if (orga == null) return "Organisation ist null"; if (!IsLeistungserbringergruppeValid(orga.Leistungserbringergruppe)) return $"Die Organisation \"{orga.Name}\" hat keine gültige Leistungserbringergruppe: \"{orga.Leistungserbringergruppe}\". Erwarten werden 5 Stellen für das Tarifkennzeichen alleine oder 7 Stellen für den Abrechnungscode und für das Tarifkennzeichen zusammen."; if (!IsIKNumberValid(orga.IKKrankenkasse)) return $"Die Organisation \"{orga.Name}\" hat kein gültiges IK Krankenkasse Kennzeichen: \"{orga.IKKrankenkasse}\"."; if (!IsIKNumberValid(orga.IKKostentrager)) return $"Die Organisation \"{orga.Name}\" hat kein gültiges IK Kostenträger Kennzeichen: \"{orga.IKKostentrager}\"."; if (!IsIKNumberValid(orga.IKDatenannahmestelle)) return $"Die Organisation \"{orga.Name}\" hat kein gültiges IK Datenannahmestelle Kennzeichen: \"{orga.IKDatenannahmestelle}\"."; if (string.IsNullOrWhiteSpace(orga.BezDatenannahmestelle)) return $"Die Organisation \"{orga.Name}\" hat keine gültige Bezeichnung Datenannahmestelle: \"{orga.BezDatenannahmestelle}\"."; return null; } public static string ValidateInvoiceBases(IEnumerable invoices) { foreach (var invoice in invoices) { if (ValidateInvoiceBase(invoice) is string error) return error; } if (!AreAllAddressSame(invoices)) return "Unterschiedliche Rechnungspositionen"; return null; } public static string ValidateInvoiceBase(IInvoiceBase invoice) { if (invoice.InvoiceNumber is null) return $"leere Rechnungsnummer nicht erlaubt für die GKV-Abrechnung"; if (!IsInvoiceNumberGkvValid(invoice.InvoiceNumber)) return $"Rechnungsnummer \"{invoice.InvoiceNumber}\" ist ungültig für die GKV-Abrechnung"; if (invoice.IInvoiceItems is object && invoice.IInvoiceItems.Any()) { foreach (var invoiceitem in invoice.IInvoiceItems) { if (!IsUnitDescriptionValid(invoiceitem)) return $"Ungültige Rechnungsposition: {invoiceitem.ItemDescription}:{invoiceitem.UnitDescription}"; } } 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) => IsIKNumberValid(ik_datenannahmestelle, ik_kostentrager, ik_krankenkasse) && IsBezDatenannahmestelleValid(bez_datenannahmestelle); } }