214 lines
8.2 KiB
C#
214 lines
8.2 KiB
C#
using BS.Shared.DataContracts;
|
|
using BS.Shared.DataContracts.GkvAbrechnung;
|
|
using BS.Shared.Exceptions;
|
|
using BS.Shared.Interface;
|
|
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 GkvValidator
|
|
{
|
|
public static bool? IsValid(ValidationType val_type, string val_str)
|
|
{
|
|
if (string.IsNullOrEmpty(val_str))
|
|
return null;
|
|
|
|
switch (val_type)
|
|
{
|
|
case ValidationType.CustomerVersichertenstatus:
|
|
return IsVersichertenstatusValid(val_str);
|
|
case ValidationType.CustomerVersichertennummer:
|
|
return IsVersichertennummerValid(val_str);
|
|
case ValidationType.OrganisationIKNumber:
|
|
return IsIKNumberValid(val_str);
|
|
case ValidationType.OrganisationLeistungserbringergruppe:
|
|
return IsLeistungserbringergruppeValid(val_str);
|
|
case ValidationType.OrganisationBezDatenannahmestelle:
|
|
return IsBezDatenannahmestelleValid(val_str);
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
public static string InvalidTooltipTxt(ValidationType val_type)
|
|
{
|
|
switch (val_type)
|
|
{
|
|
case ValidationType.CustomerVersichertenstatus:
|
|
return "CustomerVersichertenstatus invalid";
|
|
case ValidationType.CustomerVersichertennummer:
|
|
return "CustomerVersichertennummer invalid";
|
|
case ValidationType.OrganisationIKNumber:
|
|
return "OrganisationIKNumber invalid";
|
|
case ValidationType.OrganisationLeistungserbringergruppe:
|
|
return "OrganisationLeistungserbringergruppe invalid";
|
|
case ValidationType.OrganisationBezDatenannahmestelle:
|
|
return "OrganisationBezDatenannahmestelle invalid";
|
|
}
|
|
|
|
return "xxx";
|
|
}
|
|
|
|
public static string ValidateCustomer(string insuranceNumber, string versichertenStatus)
|
|
{
|
|
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.";
|
|
else if (!valid_number)
|
|
return $"Versichertennummer des {Translation.Translator.Translate("Klient/in")} ungültig";
|
|
else if (!valid_status)
|
|
return $"Versichertenstatus des {Translation.Translator.Translate("Klient/in")} ungültig";
|
|
|
|
return null;
|
|
}
|
|
|
|
public static void ValidateMandator(MandatorDC mandatordc)
|
|
{
|
|
if (mandatordc == null)
|
|
throw new GkvException("Mandator ist null");
|
|
|
|
if (!IsIKNumberValid(mandatordc.IKLeistungserbringer))
|
|
throw new GkvException($"Die IK Nummer des Leistungserbringers \"{mandatordc.IKLeistungserbringer}\" ist ungültig.");
|
|
}
|
|
public static void ValidateCustomer(CustomerDC customerDC)
|
|
{
|
|
string error = null;
|
|
|
|
if (customerDC == null)
|
|
error = "Customer ist null";
|
|
else if (!IsVersichertennummerValid(customerDC.InsuranceNumber))
|
|
error = $"Klient/in \"{customerDC.LastName}, {customerDC.FirstName}\" hat keine gültige Versichertennummer";
|
|
else if (!IsVersichertenstatusValid(customerDC.VersichertenStatus))
|
|
error = $"Klient/in \"{customerDC.LastName}, {customerDC.FirstName}\" hat keinen gültigen Versichertenstatus";
|
|
|
|
if (error != null)
|
|
throw new GkvException(error);
|
|
}
|
|
public static void ValidateOrganisation(OrganisationDC orga)
|
|
{
|
|
string error = null;
|
|
|
|
if (orga == null)
|
|
error = "Organisation ist null";
|
|
else if (!IsLeistungserbringergruppeValid(orga.Leistungserbringergruppe))
|
|
error = $"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.";
|
|
else if (!IsIKNumberValid(orga.IKKrankenkasse))
|
|
error = $"Die Organisation \"{orga.Name}\" hat kein gültiges IK Krankenkasse Kennzeichen: \"{orga.IKKrankenkasse}\".";
|
|
else if (!IsIKNumberValid(orga.IKKostentrager))
|
|
error = $"Die Organisation \"{orga.Name}\" hat kein gültiges IK Kostenträger Kennzeichen: \"{orga.IKKostentrager}\".";
|
|
else if (!IsIKNumberValid(orga.IKDatenannahmestelle))
|
|
error = $"Die Organisation \"{orga.Name}\" hat kein gültiges IK Datenannahmestelle Kennzeichen: \"{orga.IKDatenannahmestelle}\".";
|
|
else if (string.IsNullOrWhiteSpace(orga.BezDatenannahmestelle))
|
|
error = $"Die Organisation \"{orga.Name}\" hat keine gültige Bezeichnung Datenannahmestelle: \"{orga.BezDatenannahmestelle}\".";
|
|
|
|
if (error != null)
|
|
throw new GkvException(error);
|
|
}
|
|
public static string ValidateInvoiceBases(IEnumerable<IInvoiceBase> 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)
|
|
=> 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)
|
|
{
|
|
return !string.IsNullOrWhiteSpace(bez_datenannahmestelle);
|
|
}
|
|
public static bool IsIKNumberValid(string iknummer)
|
|
{
|
|
if (iknummer == null)
|
|
return false;
|
|
|
|
iknummer = iknummer.Trim();
|
|
|
|
if (iknummer.Length != 9)
|
|
return false;
|
|
|
|
return int.TryParse(iknummer, out int x);
|
|
}
|
|
public static bool IsVersichertennummerValid(string nummer)
|
|
{
|
|
if (nummer == null)
|
|
return false;
|
|
|
|
nummer = nummer.Trim();
|
|
|
|
if (nummer.Length < 6)
|
|
return false;
|
|
|
|
if (nummer.Length > 12)
|
|
return false;
|
|
|
|
return true;
|
|
}
|
|
public static bool IsVersichertenstatusValid(string status)
|
|
{
|
|
if (status == null)
|
|
return false;
|
|
|
|
status = status.Trim();
|
|
|
|
if (status.Length == 0)
|
|
return false;
|
|
|
|
if (status.Length == 6)
|
|
return false;
|
|
|
|
if (status.Length >= 8)
|
|
return false;
|
|
|
|
return true;
|
|
}
|
|
public static bool IsLeistungserbringergruppeValid(string code)
|
|
{
|
|
if (code == null)
|
|
return false;
|
|
|
|
code = code.Trim();
|
|
|
|
if (code.Length != 5 && code.Length != 7)
|
|
return false;
|
|
|
|
return true;
|
|
}
|
|
public static bool IsInvoiceNumberValid(string invoiceNumber)
|
|
{
|
|
if (string.IsNullOrEmpty(invoiceNumber))
|
|
return false;
|
|
|
|
var pattern = @"^(?!.*[-/]{2})(?![-/])(?!.*[-/]$)[A-Za-z0-9]+(?:[/-][A-Za-z0-9]+)*$";
|
|
|
|
return Regex.IsMatch(invoiceNumber, pattern);
|
|
}
|
|
}
|
|
}
|