Compare commits
5 Commits
master
...
feature_re
| Author | SHA1 | Date | |
|---|---|---|---|
| 77adfa32e9 | |||
| 4f0fb00b0a | |||
| 99d507dace | |||
| 8776a89ca0 | |||
| bcda4c8271 |
@@ -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
|
||||
});
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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'
|
||||
@@ -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'
|
||||
|
||||
@@ -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'
|
||||
|
||||
@@ -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'
|
||||
|
||||
@@ -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'
|
||||
|
||||
@@ -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));
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
99
Shared/Core/Rule/GkvRules.cs
Normal file
99
Shared/Core/Rule/GkvRules.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
139
Shared/Core/Validation/GkvValidation.cs
Normal file
139
Shared/Core/Validation/GkvValidation.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
@@ -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; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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" />
|
||||
|
||||
Reference in New Issue
Block a user