140 lines
5.3 KiB
C#
140 lines
5.3 KiB
C#
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<IInvoiceBase> 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<IInvoiceBase> 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 (!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);
|
|
}
|
|
}
|