2025-11-21 11:51:02 +01:00
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 )
{
2026-03-07 19:23:59 +01:00
if ( invoice . InvoiceNumber is null )
return $"leere Rechnungsnummer nicht erlaubt für die GKV-Abrechnung" ;
2025-11-21 11:51:02 +01:00
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 ) ;
}
}