5 Commits

Author SHA1 Message Date
77adfa32e9 Lädt nur noch aktuelle GKV Abrechnung -> Verbesserungfähig
Muss mit aktueller DB getestet werden
2025-11-24 10:28:48 +01:00
4f0fb00b0a Logikfehler + wird nicht mehr benutzt (vorher umgebaut) 2025-11-21 15:39:52 +01:00
99d507dace Kostenträgerdateien Stand 1.10.2025 2025-11-21 12:22:57 +01:00
8776a89ca0 Sortierung -> Keine Server/Client Probleme 2025-11-21 11:51:02 +01:00
bcda4c8271 Mandator Namenslänge 2025-11-21 10:10:24 +01:00
19 changed files with 329 additions and 293 deletions

View File

@@ -136,9 +136,9 @@ namespace BeWo
AutoLogin = true,
//SelectView = UIContext.Organisation,
//SelectIndex = 8,
DefaultLoginUsername = "admin",
DefaultLoginPassword = "bewobewo",
DefaultProfilename = "5000000000",
//DefaultLoginUsername = "admin",
//DefaultLoginPassword = "bewobewo",
//DefaultProfilename = "5000000000",
EnableAutoRemoteDebugging = true
});

View File

@@ -23,9 +23,11 @@ using BeWo.ViewModel.ListViewModel.Light;
using BS.Shared;
using BS.Shared.AppSender;
using BS.Shared.Core;
using BS.Shared.Core.Validation;
using BS.Shared.DataContracts;
using BS.Shared.DataContracts.GkvAbrechnung;
using BS.Shared.DataContracts.Light;
using BS.Shared.Exceptions;
using BS.Shared.Extensions;
using DevExpress.Data.Filtering;
using DevExpress.Mvvm;
@@ -79,9 +81,17 @@ namespace BeWo.View.Detail.Accounting
{
_IsRequesting = true;
var gkv = ServiceFacade.DoGkvAccountingServiceSync(x => x.GetAllGkvAbrechnungen());
var filter = new GkvAbrechnungViewFilterDC();
UpdateGkvAbrechnungList(gkv);
filter.FilterTime = true;
filter.Start = _Viewmodel.DateTimeSpanFilter.StartDate;
filter.End = _Viewmodel.DateTimeSpanFilter.EndDate;
filter.FilterForCreationDate = true;
ServiceFacade.DoGkvAccountingServiceAsync(
x => x.GetAllGkvAbrechnungenBy(filter),
cb => UpdateGkvAbrechnungList(cb),
exp => _IsRequesting = false);
}
catch (Exception e)
{
@@ -155,11 +165,19 @@ namespace BeWo.View.Detail.Accounting
if (!checked_invoice_bases.Any())
return;
var success = ValidatorExtended.TryValidateGkvAbrechnung(gkv_abrechnung, checked_invoice_bases, out var error, false);
if (!success)
string error = "default";
try
{
var txt = error;
var result = MessageBox.Show(txt, "Hinweis", MessageBoxButton.OK);
error = GkvValidation.ValidateGkvAbrechnung(gkv_abrechnung, checked_invoice_bases);
}
catch (GkvException gkv_exc)
{
error = gkv_exc.Message;
}
if(error is string)
{
var result = MessageBox.Show(error, "Hinweis", MessageBoxButton.OK);
return;
}

View File

@@ -10,6 +10,8 @@ using BeWo.ViewModel.ListViewModel;
using BS.Shared;
using BS.Shared.Core;
using BS.Shared.Core.Rule;
using BS.Shared.Core.Validation;
using BS.Shared.DataContracts;
using BS.Shared.DataContracts.GkvAbrechnung;
@@ -713,8 +715,8 @@ namespace BeWo.ViewModel
}
public bool IsIKNumberValid
=> GkvValidator.IsIKNumberValid(IKKrankenkasse)
&& GkvValidator.IsLeistungserbringergruppeValid(Leistungserbringergruppe);
=> GkvRules.IsIKNumberValid(IKKrankenkasse)
&& GkvRules.IsLeistungserbringergruppeValid(Leistungserbringergruppe);
public string IKKrankenkasse
{

View File

@@ -1,5 +1,5 @@
UNA:+,? '
UNB+UNOC:3+109910000+999999999+250611:1029+00392++AO05Q325ke0'
UNB+UNOC:3+109910000+999999999+250901:1030+00394++AO05Q425ke0'
UNH+00001+KOTR:02:001:KV'
IDK+100295017+99+gkv informatik'
VDT+19970403'
@@ -1426,8 +1426,8 @@ VKG+02+108018007+5++07++08++00'
VKG+02+107299005+5++07++14++00'
NAM+01+kubus IT DAV'
ANS+1+98528+Suhl+Fröhliche-Mann-Straße 3A'
ASP+01+0921 7871 50300+0921 7871-33031+Frau Kindsmiller+DTA §302'
ASP+02+0921 7871 50300+0921 7871-42356+Herr Götz+DTA § 302'
ASP+01+0921 7871 50300+0921 7871-33031+Frau Kastenhuber+DTA §302'
ASP+02+0921 7871 50300+0921 7871-42356+Herr Bothner+DTA § 302'
UEM+7+14+I8'
UEM+1+00+I8'
DFU+01+011++0000+2400+1+ISDN'
@@ -1792,8 +1792,8 @@ VKG+02+104212516+5++07++05+38+00'
VKG+02+103119199+5++07++04++00'
NAM+01+DAV AOK Plus Sachsen'
ANS+1+01067+Dresden+Sternplatz 7'
ASP+01+0921 7871 50300+0921 7871-33031+Frau Kindsmiller+DTA § 302'
ASP+02+0921 7871 50300+0921 7871-42356+Herr Götz+DTA § 302'
ASP+01+0921 7871 50300+0921 7871-33031+Frau Kastenhuber+DTA § 302'
ASP+02+0921 7871 50300+0921 7871-42356+Herr Bothner+DTA § 302'
UEM+1+00+I8'
DFU+01+011++0000+2400+1+ISDN 0351/4925115'
DFU+02+070++0000+2400+1+da@dta.aok.de'
@@ -2029,8 +2029,8 @@ VKG+02+100696023+5++07++12++00'
VKG+02+107299005+5++07++14++00'
NAM+01+DAV AOK Bayern - kubus IT'
ANS+1+95444+Bayreuth+Friedrich-Puchta-Straße 27'
ASP+01+0921 7871 50300+0921 7871-42356+Herr Götz+DTA § 302'
ASP+02+0921 7871 50300+0921 7871-33031+Frau Kindsmiller+DTA §302'
ASP+01+0921 7871 50300+0921 7871-42356+Frau Kastenhuber+DTA § 302'
ASP+02+0921 7871 50300+0921 7871-33031+Herr Bothner+DTA §302'
UEM+1+00+I8'
DFU+01+011++0000+2400+1+ISDN-Nr. 0180-5449450'
DFU+02+004++0000+2400+1+X.400-Adresse C=de, A=viat, P=AOK, sn=multicom, O=Bayern, OU1=dav'
@@ -2531,4 +2531,4 @@ ANS+1+40468+D
ANS+2+40004+Düsseldorf+10 13 41'
ASP+01+02118791/56515++Frau Kromat+Fahrkosten'
UNT+000009+00206'
UNZ+000206+00392'
UNZ+000206+00394'

View File

@@ -1,5 +1,5 @@
UNA:+,? '
UNB+UNOC:3+104027544+999999999+250325:1445+00241++BK05Q225KE1'
UNB+UNOC:3+104027544+999999999+251015:1445+00242++BK05Q425KE0'
UNH+00001+KOTR:02:001:KV'
IDK+100820488+99+Brandenburgische BKK'
VDT+20100101'
@@ -5763,11 +5763,11 @@ ANS+1+37115+Duderstadt+Adenauerring 25'
ANS+2+37106+Duderstadt+1331'
UNT+000008+00330'
UNH+00331+KOTR:02:001:KV'
IDK+104027544+99+BITMARCK Service GmbH Essen'
IDK+104027544+99+BITMARCK'
VDT+19960101'
FKT+01'
NAM+01+BITMARCK Service GmbH Essen'
ANS+2+45004+Essen+100453'
NAM+01+BITMARCK GmbH'
ANS+2+45004+Essen+Postfach 100451'
ASP+01+0800-24862725+080024862725329+servicedesk@bitmarck.de+§ 302 SGB V'
UEM+1+00+I8'
DFU+01+070+++++le@bitmarck-daten.de'
@@ -6083,4 +6083,4 @@ NAM+01+Betriebskrankenkasse+futur+Gesch.Ber.Neue Bundesl
ANS+1+47803+Krefeld+Girmesgath 5'
ANS+3+70426+Stuttgart'
UNT+000009+00365'
UNZ+000365+00241'
UNZ+000365+00242'

View File

@@ -1,5 +1,5 @@
UNA:+,? '
UNB+UNOC:3+109979990+999999999+250605:1125+00003++EK05Q325KE0'
UNB+UNOC:3+109979990+999999999+250923:1612+00004++EK05Q425KE0'
UNH+00001+KOTR:02:001:KV'
IDK+100167999+99+DAK+78602'
VDT+19951001'
@@ -887,9 +887,8 @@ VKG+09+103170002+5++29++99++94'
NAM+01+Handelskrankenkasse (hkk)'
ANS+1+28195+Bremen+Martinistr 26'
ANS+3+28185+Bremen'
ASP+01+0421 3655-1780++Anabelle Schwarz+hkk; Anabelle.Schwarz@hkk.de'
ASP+02+07641 9201-318++Herr Goldschmidt+ARZ Emmendingen; dale@arz-emmendingen.de'
UNT+000080+00081'
ASP+01+07641 9201-318++Herr Goldschmidt+ARZ Emmendingen; dale@arz-emmendingen.de'
UNT+000079+00081'
UNH+00082+KOTR:02:001:KV'
IDK+103467998+99+DAK+20602'
VDT+19951001'
@@ -1053,11 +1052,11 @@ ANS+1+86165+Augsburg+Zugspitzstr. 181'
ANS+3+40252+Düsseldorf'
UNT+000009+00101'
UNH+00102+KOTR:02:001:KV'
IDK+104593971+99+BITMARCK SERVICE GMBH ESSEN'
IDK+104593971+99+BITMARCK'
VDT+20151001'
FKT+01'
NAM+01+BITMARCK SERVICE GMBH ESSEN'
ANS+2+45004+Essen+100453'
NAM+01+BITMARCK GmbH'
ANS+2+45004+Essen+100451'
ASP+01+0800-24862725+080024862725329+servicedesk@bitmarck.de'
UEM+1+00+I8'
DFU+01+070+++++le-dak@bitmarck-daten.de'
@@ -2652,4 +2651,4 @@ DFU+02+016+++++ftam.syntela.de?:9000'
UEM+5+00+I8'
UEM+6+00+I8'
UNT+000013+00261'
UNZ+000261+00003'
UNZ+000261+00004'

View File

@@ -1,5 +1,5 @@
UNA:+,? '
UNB+UNOC:3+109900019+999999999+250220:1000+00033++IK05Q225KE0'
UNB+UNOC:3+109900019+999999999+251017:1000+00034++IK05Q425KE0'
UNH+00001+KOTR:02:001:KV'
IDK+100202527+99+IKK Nord (vorm. IKK MV)+78301'
VDT+19950801'
@@ -1444,11 +1444,11 @@ ANS+1+44141+Dortmund+Semerteichstra
ANS+2+44006+Dortmund+Postfach 10 06 42'
UNT+000008+00144'
UNH+00145+KOTR:02:001:KV'
IDK+109900019+99+BITMARCK SERVICE GMBH ESSEN'
IDK+109900019+99+BITMARCK'
VDT+19950801'
FKT+01'
NAM+01+BITMARCK SERVICE GMBH ESSEN'
ANS+2+45004+Essen+100453'
NAM+01+BITMARCK GMBH'
ANS+2+45004+Essen+Postfach 100451'
ASP+01+0800-24862725+080024862725329+servicedesk@bitmarck.de'
UEM+1+00+I8'
DFU+01+070+++++le@bitmarck-daten.de'
@@ -2300,4 +2300,4 @@ NAM+01+IKK Classic+c/o DAVASO GmbH'
ANS+1+04316+Leipzig+Sommerfelder Str. 120'
ANS+2+04304+Leipzig+500761'
UNT+000008+00227'
UNZ+000227+00033'
UNZ+000227+00034'

View File

@@ -1,5 +1,5 @@
UNA:+,? '
UNB+UNOC:3+109908701+999999999+230207:1030+00001++LK05Q223KE0'
UNB+UNOC:3+109908701+999999999+250826:1030+00001++LK05Q425KE0'
UNH+00001+KOTR:02:001:KV'
IDK+101308719+99+LKK Schlesw.-Holst. u. Hamburg'
VDT+19950801'
@@ -101,8 +101,8 @@ UNH+00011+KOTR:02:001:KV'
IDK+102109128+99+BITMARCK'
VDT+20020101'
FKT+04'
NAM+01+BITMARCK Service GmbH'
ANS+2+45004+Essen+Postfach 10 04 53'
NAM+01+BITMARCK GmbH'
ANS+2+45004+Essen+Postfach 10 04 51'
ASP+01+0800-24862725+0800-2486272532+servicedesk@bitmarck.de'
UEM+1+00+I8'
DFU+01+070+++++le@bitmarck-daten.de'

View File

@@ -34,13 +34,13 @@ namespace BeWo.Data.Access
return false;
}
public IEnumerable<GkvAbrechnungLight> GetGkvAbrechnungen(DateTime? startDate, DateTime? endDate, bool useInvoiceDate = true)
public IEnumerable<GkvAbrechnungLight> GetGkvAbrechnungen(DateTime? startDate, DateTime? endDate, bool useInvoiceCreationDate = true)
{
if (endDate.HasValue)
endDate = endDate.Value.Date.AddDays(1).AddMilliseconds(-1);
var lCriteria = CreateCriteriaIsActive<GkvAbrechnungLight>();
if (useInvoiceDate)
if (useInvoiceCreationDate)
{
if (startDate.HasValue)
lCriteria.Add(Restrictions.Ge(nameof(GkvAbrechnungLight.ErstelltAm), startDate));

View File

@@ -3,6 +3,7 @@ using BeWo.Data.Entities;
using BeWo.Data.Entities.Light;
using BS.Shared;
using BS.Shared.Core;
using BS.Shared.Core.Validation;
using BS.Shared.DataContracts;
using BS.Shared.DataContracts.GkvAbrechnung;
using BS.Shared.Extensions;
@@ -63,7 +64,7 @@ namespace BeWo.Service.DCEntityMapper
// Hole OrganisationLight
var orga = DAOFactory.GenericDAO.LoadByID<OrganisationLight>(orga_oid);
if (!GkvValidator.IsOrganisationInformationValid(orga))
if (!GkvValidation.IsOrganisationInformationValid(orga))
{
isReady = false;
tooltip = "Organisation ist nicht Gkv Ready";

View File

@@ -7,6 +7,7 @@ using BeWo.Data.Entities;
using BS.Shared;
using BS.Shared.DataContracts;
using BS.Shared.Core.Validation;
namespace BeWo.Service.DCEntityMapper
{
@@ -147,9 +148,9 @@ namespace BeWo.Service.DCEntityMapper
pDataContract.CustomerFirstName = customer.Person.FirstName;
pDataContract.CustomerLastName = customer.Person.LastName;
var error = GkvValidator.ValidateCustomer(customer.InsuranceNumber, customer.VersichertenStatus);
var error = GkvValidation.ValidateCustomer(customer.InsuranceNumber, customer.VersichertenStatus);
if (error is null)
error = GkvValidator.ValidateInvoiceBase(pDataContract);
error = GkvValidation.ValidateInvoiceBase(pDataContract);
pDataContract.IsGkvValidError = error;
pDataContract.IsGkvValid = error is null;

View File

@@ -15,6 +15,7 @@ using BeWo.Service.ServiceContracts;
using BeWo.ServiceUtils.History;
using BS.Shared;
using BS.Shared.Core;
using BS.Shared.Core.Validation;
using BS.Shared.DataContracts;
using BS.Shared.DataContracts.Compact;
using BS.Shared.Extensions;
@@ -852,7 +853,7 @@ namespace BeWo.Service.ServiceImplementations
IList<Organisation> list = DAOFactory.GenericDAO.GetAllActiveAndArchived<Organisation>();
list = list.Where(x => !x.GkvAusblenden &&
GkvValidator.IsOrganisationInformationValid(x.IKDatenannahmestelle, x.IKKostentrager, x.IKKrankenkasse, x.BezDatenannahmestelle)).ToList();
GkvValidation.IsOrganisationInformationValid(x)).ToList();
return CreateCompactOrganisations(list);
}

View File

@@ -9,6 +9,7 @@ using BeWo.Service.ServiceContracts;
using BS.Shared;
using BS.Shared.AppSender;
using BS.Shared.Core;
using BS.Shared.Core.Validation;
using BS.Shared.DataContracts;
using BS.Shared.DataContracts.Compact;
using BS.Shared.DataContracts.GkvAbrechnung;
@@ -81,7 +82,7 @@ namespace BeWo.Service.ServiceImplementations
{
var start = gkvAbrechnungViewFilter.Start;
var end = gkvAbrechnungViewFilter.End;
var filter = gkvAbrechnungViewFilter.FilterForInvoiceDate;
var filter = gkvAbrechnungViewFilter.FilterForCreationDate;
return GetGkvAbrechnungen(() => DAOFactory.FinanceDAO.GetGkvAbrechnungen(start, end, filter));
}
@@ -140,7 +141,7 @@ namespace BeWo.Service.ServiceImplementations
{
var invoice_bases = DAOFactory.GenericDAO.LoadByIDs<InvoiceBase>(request.SelectedInvoiceBases);
ValidatorExtended.ValidateGkvAbrechnung(request.GkvAbrechnungDC, invoice_bases);
GkvValidation.ValidateGkvAbrechnung(request.GkvAbrechnungDC, invoice_bases);
var gkv_abrechnung = MapperFactory.GkvAbrechnungDC_GkvAbrechnung.MapToNewEntity(request.GkvAbrechnungDC);
@@ -362,6 +363,12 @@ namespace BeWo.Service.ServiceImplementations
private GkvTransferProtokoll CreateGkvTransferProtokoll(GkvAbrechnung gkvAbrechnung, out string error)
{
Action<string> eval = (error_str) =>
{
if (error_str is string)
throw new GkvException(error_str);
};
var protokoll = new GkvTransferProtokoll
{
ErstelltAm = DateTime.Now,
@@ -372,17 +379,17 @@ namespace BeWo.Service.ServiceImplementations
try
{
ValidatorExtended.ValidateGkvAbrechnung(gkvAbrechnung, gkvAbrechnung.InvoiceBases);
eval(GkvValidation.ValidateGkvAbrechnung(gkvAbrechnung, gkvAbrechnung.InvoiceBases));
var manager = new DakotaManager();
var mandatordc = new OperationsServiceImp().GetMandator();
GkvValidator.ValidateMandator(mandatordc);
eval(GkvValidation.ValidateMandator(mandatordc));
var gkvAbrechnungDC = MapperFactory.GkvAbrechnungDC_GkvAbrechnung.MapToNewDC(gkvAbrechnung);
var orgadc = gkvAbrechnungDC.Organisation;
GkvValidator.ValidateOrganisation(orgadc);
eval(GkvValidation.ValidateOrganisation(orgadc));
var datenannahmestelle = orgadc.IKDatenannahmestelle;
var (datenaustauschreferenz, transfernummer) = GetNextDatenaustauschreferenzTransfernummer(gkvAbrechnung, datenannahmestelle);
@@ -416,7 +423,7 @@ namespace BeWo.Service.ServiceImplementations
var servicedc = MapperFactory.ServiceInvoiceDC_ServiceInvoice.MapToNewDC(service);
var customerdc = MapperFactory.CustomerDC_Customer.MapToNewDC(customer);
GkvValidator.ValidateCustomer(customerdc);
eval(GkvValidation.ValidateCustomer(customerdc));
manager.Add(servicedc, orgadc, customerdc, addressInfo, dat_short, tra_short);
}

View File

@@ -1,4 +1,5 @@
using BS.Shared.DataContracts;
using BS.Shared.Core.Rule;
using BS.Shared.DataContracts;
using BS.Shared.DataContracts.GkvAbrechnung;
using BS.Shared.Exceptions;
using BS.Shared.Interface;
@@ -21,15 +22,15 @@ namespace BS.Shared.Core
switch (val_type)
{
case ValidationType.CustomerVersichertenstatus:
return IsVersichertenstatusValid(val_str);
return GkvRules.IsVersichertenstatusValid(val_str);
case ValidationType.CustomerVersichertennummer:
return IsVersichertennummerValid(val_str);
return GkvRules.IsVersichertennummerValid(val_str);
case ValidationType.OrganisationIKNumber:
return IsIKNumberValid(val_str);
return GkvRules.IsIKNumberValid(val_str);
case ValidationType.OrganisationLeistungserbringergruppe:
return IsLeistungserbringergruppeValid(val_str);
return GkvRules.IsLeistungserbringergruppeValid(val_str);
case ValidationType.OrganisationBezDatenannahmestelle:
return IsBezDatenannahmestelleValid(val_str);
return GkvRules.IsBezDatenannahmestelleValid(val_str);
}
return false;
@@ -53,158 +54,5 @@ namespace BS.Shared.Core
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)
{
var pattern = @"^(?!.*[-/]{2})(?![-/])(?!.*[-/]$)[A-Za-z0-9]+(?:[/-][A-Za-z0-9]+)*$";
return Regex.IsMatch(invoiceNumber, pattern);
}
}
}

View File

@@ -0,0 +1,99 @@
using BS.Shared.Extensions;
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.Rule
{
public static class GkvRules
{
public static bool IsBezDatenannahmestelleValid(string bez_datenannahmestelle)
{
return !string.IsNullOrWhiteSpace(bez_datenannahmestelle);
}
public static bool IsIKNumberValid(params string[] iks)
=> iks?.All(IsIKNumberValid) ?? false;
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 IsInvoiceNumberGkvValid(string invoiceNumber)
{
var pattern = @"^(?!.*[-/]{2})(?![-/])(?!.*[-/]$)[A-Za-z0-9]+(?:[/-][A-Za-z0-9]+)*$";
return Regex.IsMatch(invoiceNumber, pattern);
}
// Neu
public static bool AreAllAddressSame(IEnumerable<IInvoiceBase> invoiceBases)
=> invoiceBases.Select(x => x.SenderAddressToString()).AreAllTheSame();
public static bool IsUnitDescriptionValid(IInvoiceItem invoiceItem)
{
// GPos. 123456
// 0123456
return invoiceItem.UnitDescription.Length >= 8;
}
}
}

View File

@@ -0,0 +1,139 @@
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);
}
}

View File

@@ -1,80 +0,0 @@
using BS.Shared.DataContracts;
using BS.Shared.DataContracts.GkvAbrechnung;
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.Text.RegularExpressions;
using System.Threading.Tasks;
namespace BS.Shared.Core
{
public static class ValidatorExtended
{
public static void ValidateGkvAbrechnung(IGkvAbrechnung gkvAbrechnung, IEnumerable<IInvoiceBase> invoiceBases, bool testInvoicesEmpty = true)
{
string error = null;
if (testInvoicesEmpty && !invoiceBases.Any())
error = "Keine Rechnungen gefunden";
else if (!AreAllAddressSame(invoiceBases))
error = "Unterschiedliche Rechnungspositionen";
else if (GetInvalidUnitDescription(invoiceBases) is IInvoiceItem invalid)
error = $"Ungültige Rechnungsposition: {invalid.ItemDescription}:{invalid.UnitDescription}";
else if (GkvValidator.ValidateInvoiceBases(invoiceBases) is string rtn_error)
error = rtn_error;
if(error is string)
throw new GkvException(error, "Validierung");
}
public static bool TryValidateGkvAbrechnung(IGkvAbrechnung gkvAbrechnung, IEnumerable<IInvoiceBase> invoiceBases, out string error, bool testInvoicesEmpty = true)
{
error = "default";
try
{
ValidateGkvAbrechnung(gkvAbrechnung, invoiceBases, testInvoicesEmpty);
return true;
}
catch (GkvException gkv)
{
error = gkv.Message;
}
catch (Exception)
{
}
return false;
}
public static bool AreAllAddressSame(IEnumerable<IInvoiceBase> invoiceBases)
=> invoiceBases.Select(x => x.SenderAddressToString()).AreAllTheSame();
public static IInvoiceItem GetInvalidUnitDescription(IEnumerable<IInvoiceBase> invoiceBases){
foreach(var invoiceBase in invoiceBases)
{
if (invoiceBase.IInvoiceItems is null && !invoiceBase.IInvoiceItems.Any())
continue;
foreach (var invoiceitem in invoiceBase.IInvoiceItems)
{
// GPos. 123456
// 0123456
var desc = invoiceitem.UnitDescription;
if (desc.Length < 8)
return invoiceitem;
}
}
return null;
}
}
}

View File

@@ -15,6 +15,6 @@ namespace BS.Shared.DataContracts.GkvAbrechnung
[DataMember] public bool FilterTime { get; set; }
[DataMember] public DateTime? Start { get; set; }
[DataMember] public DateTime? End { get; set; }
[DataMember] public bool FilterForInvoiceDate { get; set; }
[DataMember] public bool FilterForCreationDate { get; set; }
}
}

View File

@@ -148,6 +148,7 @@
<Compile Include="Core\Facade\JsonHttpClientFacade.cs" />
<Compile Include="Core\JsonUtils.cs" />
<Compile Include="Core\MailUtils.cs" />
<Compile Include="Core\Rule\GkvRules.cs" />
<Compile Include="Core\SecurityUtils.cs" />
<Compile Include="Core\TokenUtils.cs" />
<Compile Include="Core\Utilities\WebUtils.cs" />
@@ -178,7 +179,7 @@
<Compile Include="Core\Utils.cs" />
<Compile Include="Core\EventArgs.cs" />
<Compile Include="Core\ObservableSortCollection.cs" />
<Compile Include="Core\ValidatorExtended.cs" />
<Compile Include="Core\Validation\GkvValidation.cs" />
<Compile Include="Core\Facade\WebClientFacade.cs" />
<Compile Include="Core\WohnheimbuchungsIntervall.cs" />
<Compile Include="DataContracts\AbsenceOverviewFilterDC.cs" />