This commit is contained in:
2024-10-28 15:48:18 +01:00
parent 9445cdf28a
commit 4b78dfd717
27 changed files with 258 additions and 241 deletions

View File

@@ -140,11 +140,13 @@ namespace BeWo.View.Detail.Accounting
MainControl.CloseCurrentPopUp();
var gkv_abrechnung = e.Data;
var gkv_filter = new GkvAbrechnungCreateRequestDC(gkv_abrechnung);
var gkv_filter = new GkvAbrechnungCreateRequestDC
{
GkvAbrechnungDC = gkv_abrechnung,
SelectedInvoiceBases = checked_invoice_bases.Select(x => x.DataContract.InvoiceBaseOid.Value).ToList()
};
gkv_filter.SelectedInvoiceBases = checked_invoice_bases.Select(x => x.DataContract.InvoiceBaseOid.Value).ToList();
ServiceFacade.DoAccountingServiceAsync(x => x.CreateNewGkvAbrechnung(gkv_filter),
ServiceFacade.DoAccountingServiceAsync(x => x.CreateNewGkvAbrechnung(gkv_filter),
cb => Dispatcher.BeginInvoke(DispatcherPriority.Normal,
(Action)delegate
{
@@ -154,7 +156,7 @@ namespace BeWo.View.Detail.Accounting
}
else
{
BeWoWindowBuilder.ShowErrorMessageBox(cb.Error);
BeWoWindowBuilder.ShowErrorMessageBox(cb.Message);
}
}));
}

View File

@@ -2,6 +2,7 @@
using BS.Shared.Core;
using BS.Shared.DataContracts;
using BS.Shared.DataContracts.GkvAbrechnung;
using BS.Shared.Exceptions;
using Dakota.Models;
using System;
using System.Collections.Generic;
@@ -95,54 +96,5 @@ namespace Dakota
return input.Trim();
}
/// <summary>
/// Validiert in erster Phase den Mandator.
/// </summary>
public static void ValidateMandator(MandatorDC mandatordc)
{
if (mandatordc == null)
throw new DakotaException("Mandator ist null");
if (!DakotaValidator.IsIKNumberValid(mandatordc.IKLeistungserbringer))
throw new DakotaException($"Die IK Nummer des Leistungserbringers \"{mandatordc.IKLeistungserbringer}\" ist ungültig.");
}
/// <summary>
/// Validiert in zweiter Phase die Daten. Bei Fehler wird eine DakotaException geworfen.
/// </summary>
public static void ValidateCustomer(CustomerDC customerDC)
{
string error = null;
if (customerDC == null)
error = "Customer ist null";
else if (!DakotaValidator.IsVersichertennummerValid(customerDC.InsuranceNumber))
error = $"Klient/in \"{customerDC.LastName}, {customerDC.FirstName}\" hat keine gültige Versichertennummer";
else if (!DakotaValidator.IsVersichertenstatusValid(customerDC.VersichertenStatus))
error = $"Klient/in \"{customerDC.LastName}, {customerDC.FirstName}\" hat keinen gültigen Versichertenstatus";
if (error != null)
throw new DakotaException(error);
}
public static void ValidateOrganisation(Organisation orga)
{
string error = null;
if (orga == null)
error = "Organisation ist null";
else if (!DakotaValidator.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 (!DakotaValidator.IsIKNumberValid(orga.IKKrankenkasse))
error = $"Die Organisation \"{orga.Name}\" hat kein gültiges IK Krankenkasse Kennzeichen: \"{orga.IKKrankenkasse}\".";
else if (!DakotaValidator.IsIKNumberValid(orga.IKKostentrager))
error = $"Die Organisation \"{orga.Name}\" hat kein gültiges IK Kostenträger Kennzeichen: \"{orga.IKKostentrager}\".";
else if (!DakotaValidator.IsIKNumberValid(orga.IKDatenannahmestelle))
error = $"Die Organisation \"{orga.Name}\" hat kein gültiges IK Datenannahmestelle Kennzeichen: \"{orga.IKDatenannahmestelle}\".";
if (error != null)
throw new DakotaException(error);
}
}
}

View File

@@ -1,4 +1,5 @@
using Dakota.Models;
using BS.Shared.Exceptions;
using Dakota.Models;
using Dakota.Models.Nachrichten;
using Dakota.Models.Segmente.KTD;
using System;
@@ -102,7 +103,7 @@ namespace Dakota.Logic
if (datenannahmestellen_3.Count() == 1)
return GetIKNummern(datenannahmestellen_3.First(), kostentrager, ikkrankenkasse);
throw new DakotaException($"Keine oder mehrere Datenannahmestellen für {ikkrankenkasse} gefunden.");
throw new GkvException($"Keine oder mehrere Datenannahmestellen für {ikkrankenkasse} gefunden.");
}
private Tuple<string, string, string> GetIKNummern(SegmentKTDVKG vkg, string kostentrager, string ikkrankenkasse)

View File

@@ -1,4 +1,5 @@
using Dakota.Models.Schlüssels;
using BS.Shared.Exceptions;
using Dakota.Models.Schlüssels;
using System;
namespace Dakota.Models.Daten
@@ -36,7 +37,7 @@ namespace Dakota.Models.Daten
if (Feldart == Feldart.Muss)
{
// Auffüllen
throw new DakotaException($"Das Feld \"{Title}\" muss gefüllt sein!");
throw new GkvException($"Das Feld \"{Title}\" muss gefüllt sein!");
}
else
{
@@ -50,11 +51,11 @@ namespace Dakota.Models.Daten
{
if(_Value.Length < MinStellen)
{
throw new DakotaException($"Das Feld \"{Title}\" hat bei der Auswertung {_Value.Length} Stellen ergeben! Nach Vorgabe muss es jedoch mindestens {MinStellen} Stellen haben");
throw new GkvException($"Das Feld \"{Title}\" hat bei der Auswertung {_Value.Length} Stellen ergeben! Nach Vorgabe muss es jedoch mindestens {MinStellen} Stellen haben");
}
else if (_Value.Length > MaxStellen)
{
throw new DakotaException($"Das Feld \"{Title}\" hat bei der Auswertung {_Value.Length} Stellen ergeben! Nach Vorgabe darf es jedoch maximal {MaxStellen} Stellen haben");
throw new GkvException($"Das Feld \"{Title}\" hat bei der Auswertung {_Value.Length} Stellen ergeben! Nach Vorgabe darf es jedoch maximal {MaxStellen} Stellen haben");
}
}
@@ -89,12 +90,12 @@ namespace Dakota.Models.Daten
if (value.Length < MinStellen)
{
throw new DakotaException($"Das Feld \"{Title}\" hat bei der Erstellung {_Value.Length} Stellen ergeben! Nach Vorgabe muss es jedoch mindestens {MinStellen} Stellen haben");
throw new GkvException($"Das Feld \"{Title}\" hat bei der Erstellung {_Value.Length} Stellen ergeben! Nach Vorgabe muss es jedoch mindestens {MinStellen} Stellen haben");
}
if (value.Length > MaxStellen)
{
throw new DakotaException($"Das Feld \"{Title}\" hat bei der Erstellung {_Value.Length} Stellen ergeben! Nach Vorgabe darf es jedoch maximal {MaxStellen} Stellen haben");
throw new GkvException($"Das Feld \"{Title}\" hat bei der Erstellung {_Value.Length} Stellen ergeben! Nach Vorgabe darf es jedoch maximal {MaxStellen} Stellen haben");
}
var mod_value = DakotaUtils.ClearTextString(value);

View File

@@ -1,4 +1,5 @@
using BS.Shared.Extensions;
using BS.Shared.Exceptions;
using BS.Shared.Extensions;
using System;
using System.Collections.Generic;
using System.Linq;
@@ -27,7 +28,7 @@ namespace Dakota.Models.Schlüssels
var schlüssel = GetSchlüssel(list, str);
if (schlüssel is null)
throw new DakotaException($"KTDVerarbeitungskennzeichen {str} nicht gefunden.");
throw new GkvException($"KTDVerarbeitungskennzeichen {str} nicht gefunden.");
return schlüssel;
}

View File

@@ -156,6 +156,7 @@ namespace DakotaSender
var datenannahmestelle = split[2];
var transfername = split[3];
// Muss nachher nur entfernt werden, um andere zu testen
if (tenant != TEST_TENANT && tenant != "demo")
{
PrintLine($"{auft.FullName} wird ignoriert. Tenant {tenant} nicht gültig.");

View File

@@ -74,7 +74,10 @@ namespace BeWo.Data
if (string.IsNullOrEmpty(context.Request.FilePath))
return false;
if (context.Request.FilePath.IndexOf("GkvAbrechnungView.aspx") >= 0)
if (context.Request.FilePath.IndexOf("GkvAbrechnungServer.aspx") >= 0)
return false;
if (context.Request.FilePath.IndexOf("GkvAbrechnungClient.aspx") >= 0)
return false;
if (context.Request.FilePath.IndexOf("Admin.aspx") >= 0)

View File

@@ -1,10 +1,13 @@
using BS.Shared;
using BeWo.Data.Access;
using BeWo.Data.Entities;
using BS.Shared;
using BS.Shared.AppSender;
using BS.Shared.DataContracts.GkvAbrechnung;
using BS.Shared.Exceptions;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.IO;
using System.Linq;
using System.Threading;
@@ -18,6 +21,8 @@ namespace Host
{
private readonly string INVALID_INPUT = "Ungültige Eingabe";
private string GkvSecretKey { get; set; } = ConfigurationManager.AppSettings.Get("GkvSecretKey");
public GkvRequestDC GkvRequest { get; set; }
public void Sleep() => Thread.Sleep(5000);
@@ -53,15 +58,18 @@ namespace Host
}
}
private void ClientResult(GkvClientResultRequestDC req)
{
if (GkvSecretKey != req.GkvSecretKey)
SendInvalidInputResponse();
// Response
var response = new GkvResponseDC(false, "default");
var response = new GkvResponseDC(false);
try
{
var fehler_protokoll = DAOFactory.GenericDAO.GetByID<GkvTransferProtokoll>(req.Protokoll_Fehler_Oid);
response.Success = true;
}
catch (GkvException e)

View File

@@ -22,15 +22,13 @@ namespace Host
{
public const int PROCESS_WAITFOREXIT_MS = 10 * 1000;
private readonly string GETSERVER_URL = "https://support.bewoplaner.de/api/getserver.php?k={0}&t=0";
private readonly string LOGINSERVER_URL = "{0}/Login.aspx";
private readonly string INVALID_INPUT = "Ungültige Eingabe";
private string ResultFolderPath { get; set; } = ConfigurationManager.AppSettings.Get("GkvAbrechnungResultFolderPath");
private string QueueFolderPath { get; set; } = ConfigurationManager.AppSettings.Get("GkvAbrechnungQueueFolderPath");
private string KostentragerdateiFolderPath { get; set; } = ConfigurationManager.AppSettings.Get("GkvKostentragerdateiFolderPath");
public GkvRequestDC GkvRequest { get; set; }
protected void Page_Load(object sender, EventArgs e)
@@ -99,7 +97,7 @@ namespace Host
}
private bool TryLogin(GkvRequestDC req)
{
var server = GetServerFromTenant(req.Tenant);
var server = AppRequestSender.GetServerFromTenant(req.Tenant);
if (string.IsNullOrEmpty(server))
return false;
@@ -141,7 +139,7 @@ namespace Host
private void SendNew(GkvServerSendNewRequestDC req)
{
// Response
var response = new GkvServerSendNewResponseDC(false);
var response = new GkvServerSendNewResponseDC();
var protokoll = req.GkvTransferProtokoll;
@@ -182,10 +180,10 @@ namespace Host
var resolved = ktd_reader.Resolve(req.IKKrankenkasse, req.Abrechnungscode, req.Tarifkennzeichen);
var response = new GkvServerGetIKResponseDC();
response.Success = true;
response.Gefunden = resolved is object;
var response = new GkvServerGetIKResponseDC(true)
{
Gefunden = resolved is object
};
if (response.Gefunden)
{
@@ -203,7 +201,7 @@ namespace Host
var tuple_count = req.Oids.Length;
response.Result = new GkvApp8ResultDC[tuple_count];
response.ResultDC = new GkvServerResultDC[tuple_count];
try
{
@@ -217,7 +215,7 @@ namespace Host
if (results.TryGetValue(gkv_transfer_oid, out var fehlerDC))
{
response.Result[i] = fehlerDC;
response.ResultDC[i] = fehlerDC;
}
}
@@ -225,7 +223,7 @@ namespace Host
response.Success = true;
}
catch (DakotaException e)
catch (GkvException e)
{
response.Message = e.Message;
}
@@ -264,30 +262,6 @@ namespace Host
return finalpath;
}
private string GetServerFromTenant(string tenant)
{
#if DEBUG
// return "localhost:3777";
#endif
try
{
String url = String.Format(GETSERVER_URL, tenant);
using (WebClient client = new WebClient())
{
//MessageBox.Show(hostAddress);
byte[] response = client.UploadValues(url, "POST", new NameValueCollection());
String server = System.Text.Encoding.ASCII.GetString(response);
return server;
}
}
catch (Exception ex)
{
return null;
}
}
private void ClearResultFolder(string tenant, long[] oids)
{
var folder = new DirectoryInfo(Path.Combine(ResultFolderPath, tenant));
@@ -346,7 +320,6 @@ namespace Host
}
}
private void Sleep() => Thread.Sleep(5000);
private void SendInvalidInputResponse() => SendErrorResponse(INVALID_INPUT);

View File

@@ -240,6 +240,7 @@
<add key="GkvAbrechnungQueueFolderPath" value="C:\GkvAbrechnung\Queue\" />
<add key="GkvKostentragerdateiFolderPath" value="C:\GkvAbrechnung\KTDatei\" />
<add key="DakotaPath" value="C:\Program Files (x86)\ITSG\dakotale\dakota30.exe" />
<add key="GkvSecretKey" value="DfDGNGn72PKfSYxSUsmRdzuBtpR9novewlmYU3gsjiFgSkaZZeylUXlbO42cWNqiKgLdMUFtWUNZT962F1raQDR7HGUzCNYsFeC" />
</appSettings>
<devExpress>
<themes enableThemesAssembly="true" styleSheetTheme="" theme="" />

View File

@@ -171,6 +171,6 @@ namespace BeWo.Service.ServiceContracts
[FaultContract(typeof(BeWoFault))]
[OperationContract]
GkvServerGetIKResponseDC SendApp8GetIKRequest(GkvServerGetIKRequestDC req);
GkvAbrechnungGetIKResponseDC SendApp8GetIKRequest(GkvAbrechnungGetIKRequestDC req);
}
}

View File

@@ -26,6 +26,7 @@ using Newtonsoft.Json;
using BS.Shared.DataContracts.GkvAbrechnung;
using BS.Shared.Extensions;
using BS.Shared.Exceptions;
using BS.Shared.AppSender;
namespace BeWo.Service.ServiceImplementations
{
@@ -848,12 +849,10 @@ namespace BeWo.Service.ServiceImplementations
response.Success = true;
response.GkvAbrechnungDC = gkv_abrechnung_dc;
return response;
}
catch (GkvException exc)
{
response.Error = exc.Message;
response.Message = exc.Message;
}
catch (Exception e)
{
@@ -900,8 +899,6 @@ namespace BeWo.Service.ServiceImplementations
{
var response = new GkvAbrechnungSendResponseDC();
response.Successful = false;
var oid = req.GkvAbrechnungOid;
var entity = DAOFactory.GenericDAO.LoadByID<GkvAbrechnung>(oid);
@@ -937,7 +934,7 @@ namespace BeWo.Service.ServiceImplementations
MapperFactory.GkvTransferProtokollDC_GkvTransferprotokoll.MergeWithEntity(app8_protokoll, protokoll);
response.Successful = app8_response.Success;
response.Success = app8_response.Success;
}
catch (GkvException de)
{
@@ -961,6 +958,39 @@ namespace BeWo.Service.ServiceImplementations
return response;
}
public GkvAbrechnungGetIKResponseDC SendApp8GetIKRequest(GkvAbrechnungGetIKRequestDC req)
{
try
{
var app8req = new GkvServerGetIKRequestDC
{
IKKrankenkasse = req.IKKrankenkasse,
Leistungserbringergruppe = req.Leistungserbringergruppe,
Abrechnungscode = DakotaUtils.GetAbrechnungscode(req.Leistungserbringergruppe),
Tarifkennzeichen = DakotaUtils.GetTarifkennzeichen(req.Leistungserbringergruppe)
};
var app8res = SendApp8Request<GkvServerGetIKRequestDC, GkvServerGetIKResponseDC>(app8req);
var res = new GkvAbrechnungGetIKResponseDC
{
BezDatenannahmestelle = app8res.BezDatenannahmestelle,
Gefunden = app8res.Gefunden,
IKDatenannahmestelle = app8res.IKDatenannahmestelle,
IKKostentrager = app8res.IKKostentrager,
IKKrankenkasse = app8res.IKKrankenkasse,
Message = app8res.Message,
Success = app8res.Success
};
return res;
}
catch (Exception e)
{
throw Utils.CreateBeWoFaultException(e);
}
}
private void CreateGkvTransferProtokoll(long oid, GkvAbrechnung gkvAbrechnung, GkvTransferProtokoll protokoll)
{
try
@@ -968,39 +998,13 @@ namespace BeWo.Service.ServiceImplementations
var manager = new DakotaManager();
var mandatordc = new OperationsServiceImp().GetMandator();
DakotaUtils.ValidateMandator(mandatordc);
var orga = gkvAbrechnung.GetOrganisation();
DakotaUtils.ValidateOrganisation(orga);
if (!DakotaValidator.IsOrganisationInformationValid(orga.IKDatenannahmestelle, orga.IKKostentrager, orga.IKKrankenkasse, orga.BezDatenannahmestelle))
{
var res = SendApp8GetIKRequest(orga);
if (!res.Success)
throw new GkvException(res.Message, "Interner Fehler");
if (!res.Gefunden)
throw new GkvException($"Für die Organisation \"{orga.Name}\" mit dem IK \"{orga.IKKrankenkasse}\" konnte keine Datenannahmestelle gefunden werden. " +
$"Bitte informieren Sie sich bei der Krankenkasse, ob zum elektronischen Datenaustausch " +
$"eine seperate Anmeldung benötigt wird.");
orga.IKDatenannahmestelle = res.IKDatenannahmestelle;
orga.IKKostentrager = res.IKKostentrager;
orga.BezDatenannahmestelle = res.BezDatenannahmestelle;
if (!DakotaValidator.IsOrganisationInformationValid(orga.IKDatenannahmestelle, orga.IKKostentrager, orga.IKKrankenkasse, orga.BezDatenannahmestelle))
throw new GkvException($"Für die Organisation \"{orga.Name}\" konnten die hinterlegten IKs nicht verifiziert werden: \"{orga.BezDatenannahmestelle}\", \"{orga.IKDatenannahmestelle}\", \"{orga.IKKostentrager}\", \"{orga.IKKrankenkasse}\"", "Interner Fehler");
DAOFactory.GenericDAO.Update(orga);
gkvAbrechnung = DAOFactory.GenericDAO.LoadByID<GkvAbrechnung>(oid);
}
DakotaValidator.ValidateMandator(mandatordc);
var gkvAbrechnungDC = MapperFactory.GkvAbrechnungDC_GkvAbrechnung.MapToNewDC(gkvAbrechnung);
var orgadc = gkvAbrechnungDC.Organisation;
DakotaValidator.ValidateOrganisation(orgadc);
var datenannahmestelle = orgadc.IKDatenannahmestelle;
var (datenaustauschreferenz, transfernummer) = GetNextDatenaustauschreferenzTransfernummer(gkvAbrechnung, datenannahmestelle);
var (dat_short, tra_short) = ClearDatenaustauschreferenzTransfernummer(datenaustauschreferenz, transfernummer);
@@ -1019,7 +1023,7 @@ namespace BeWo.Service.ServiceImplementations
var servicedc = MapperFactory.ServiceInvoiceDC_ServiceInvoice.MapToNewDC(service);
var customerdc = MapperFactory.CustomerDC_Customer.MapToNewDC(customer);
DakotaUtils.ValidateCustomer(customerdc);
DakotaValidator.ValidateCustomer(customerdc);
manager.Add(servicedc, orgadc, customerdc, mandatordc, dat_short, tra_short);
}
@@ -1060,7 +1064,7 @@ namespace BeWo.Service.ServiceImplementations
protokoll.Dateiname = protokoll.Transfername;
protokoll.AbsenderBezeichnung = "ownSoft GmbH";
protokoll.EmpfangerBezeichnung = orga.BezDatenannahmestelle;
protokoll.EmpfangerBezeichnung = orgadc.BezDatenannahmestelle;
}
catch (GkvException de)
{
@@ -1162,13 +1166,13 @@ namespace BeWo.Service.ServiceImplementations
}
if (!response_app8.Success)
throw new DakotaException(response_app8.Message);
throw new GkvException(response_app8.Message);
bool allAreUpToDate = true;
for (int id = 0; id < updateables_len; id++)
{
var gkv_abrechnung = updateables[id];
var result = response_app8.Result[id];
var result = response_app8.ResultDC[id];
if (result is null)
continue;
@@ -1190,83 +1194,22 @@ namespace BeWo.Service.ServiceImplementations
return allAreUpToDate;
}
public GkvServerGetIKResponseDC SendApp8GetIKRequest(GkvServerGetIKRequestDC req)
private Res SendApp8Request<Req, Res>(Req request) where Req : GkvRequestDC where Res : GkvResponseDC
{
try
{
req.Abrechnungscode = DakotaUtils.GetAbrechnungscode(req.Leistungserbringergruppe);
req.Tarifkennzeichen = DakotaUtils.GetTarifkennzeichen(req.Leistungserbringergruppe);
return SendApp8Request<GkvServerGetIKRequestDC, GkvServerGetIKResponseDC>(req);
}
catch (Exception e)
{
throw Utils.CreateBeWoFaultException(e);
}
}
private GkvServerGetIKResponseDC SendApp8GetIKRequest(Organisation orga)
{
var gruppe = orga.Leistungserbringergruppe;
var abr = DakotaUtils.GetAbrechnungscode(gruppe);
var tarif = DakotaUtils.GetTarifkennzeichen(gruppe);
var request = new GkvServerGetIKRequestDC
{
Abrechnungscode = abr,
IKKrankenkasse = orga.IKKrankenkasse,
Tarifkennzeichen = tarif
};
return SendApp8Request<GkvServerGetIKRequestDC, GkvServerGetIKResponseDC>(request);
}
private T2 SendApp8Request<T, T2>(T request) where T : GkvRequestDC where T2 : GkvResponseDC
{
string url = "https://app8.bewoplaner.de/service/GkvAbrechnungView.aspx";
#if DEBUG
url = "http://localhost:3777/Host/GkvAbrechnungView.aspx";
#endif
var user = LoggedInUserOperationContextExt.Current?.User ?? SessionFacade.LoggedInUser;
if (user == null)
{
throw new GkvException("User unbekannt", "KApp");
throw new GkvException("User unbekannt", "KundenApp");
}
request.Username = user.LoginName;
request.Password = user.BCryptPassword;
request.Tenant = MultitenancyOperationContextExt.Current.Tenant;
return JsonConvert.DeserializeObject<T2>(SendApp8Request(url, JsonConvert.SerializeObject(request)));
return GkvSender.SendApp8Request<Req, Res>(request, request.Tenant);
}
private string SendApp8Request(string url, string dataString)
{
string response_app8_str;
try
{
url += "?tenant=" + MultitenancyOperationContextExt.Current.Tenant;
using (WebClient client = new WebClient())
{
client.Headers.Add(HttpRequestHeader.ContentType, "application/json");
response_app8_str = client.UploadString(url, "POST", dataString);
}
}
catch (Exception e)
{
throw new GkvException(e.Message, "App8");
}
if (string.IsNullOrEmpty(response_app8_str))
throw new GkvException("Leere Antwort", "App8");
return response_app8_str;
}
#endregion
}
}

View File

@@ -2,6 +2,7 @@
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Linq;
using System.Net;
using System.Text;
@@ -11,6 +12,32 @@ namespace BS.Shared.AppSender
{
public static class AppRequestSender
{
private static readonly string GETSERVER_URL = "https://support.bewoplaner.de/api/getserver.php?k={0}&t=0";
public static string GetServerFromTenant(string tenant)
{
#if DEBUG
// return "localhost:3777";
#endif
try
{
String url = String.Format(GETSERVER_URL, tenant);
using (WebClient client = new WebClient())
{
//MessageBox.Show(hostAddress);
byte[] response = client.UploadValues(url, "POST", new NameValueCollection());
String server = System.Text.Encoding.ASCII.GetString(response);
return server;
}
}
catch (Exception ex)
{
return null;
}
}
public static Res Send<Req, Res>(Req request, string url, string tenant) where Req : AppRequestDC where Res : AppResponseDC
{
request.Tenant = tenant;

View File

@@ -9,6 +9,8 @@ namespace BS.Shared.AppSender
{
public static class GkvSender
{
private static readonly string GKVCLIENT_URL = "{0}/GkvAbrechnungClient.aspx";
public static string SerializeResponse<Res>(Res response) where Res : AppResponseDC
=> JsonConvert.SerializeObject(response);
public static Req DeserializeRequest<Req>(string str, Action sendInvalidInputResponse) where Req : AppRequestDC
@@ -44,8 +46,6 @@ namespace BS.Shared.AppSender
try
{
var data = JsonConvert.SerializeObject(request);
app8_response = AppRequestSender.Send<Req, Res>(request, url, tenant);
}
catch (Exception e)
@@ -58,5 +58,36 @@ namespace BS.Shared.AppSender
return app8_response;
}
public static Res SendKundenAppClientRequest<Req, Res>(Req request, string tenant) where Req : GkvRequestDC where Res : GkvResponseDC
{
string server = AppRequestSender.GetServerFromTenant(tenant);
if (string.IsNullOrEmpty(server))
return null;
var url = string.Format(GKVCLIENT_URL, $"https://{server}/service");
#if DEBUG
if (server.IndexOf("localhost") > 0)
url = string.Format(GKVCLIENT_URL, $"http://{server}/Host");
#endif
Res app8_response;
try
{
app8_response = AppRequestSender.Send<Req, Res>(request, url, tenant);
}
catch (Exception e)
{
throw new GkvException(e.Message, "KundenApp");
}
if (app8_response is null)
throw new GkvException("Leere Antwort", "KundenApp");
return app8_response;
}
}
}

View File

@@ -1,5 +1,6 @@
using BS.Shared.DataContracts;
using BS.Shared.DataContracts.GkvAbrechnung;
using BS.Shared.Exceptions;
using System;
using System.Collections.Generic;
using System.Linq;
@@ -25,12 +26,59 @@ namespace BS.Shared.Core
return null;
}
public static bool IsMandatorValid(string ik_leistungserbringer)
=> IsIKNumberValid(ik_leistungserbringer);
/// <summary>
/// Validiert in erster Phase den Mandator.
/// </summary>
public static void ValidateMandator(MandatorDC mandatordc)
{
if (mandatordc == null)
throw new GkvException("Mandator ist null");
if (!DakotaValidator.IsIKNumberValid(mandatordc.IKLeistungserbringer))
throw new GkvException($"Die IK Nummer des Leistungserbringers \"{mandatordc.IKLeistungserbringer}\" ist ungültig.");
}
/// <summary>
/// Validiert in zweiter Phase die Daten. Bei Fehler wird eine DakotaException geworfen.
/// </summary>
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.IsNullOrEmpty(orga.BezDatenannahmestelle))
error = $"Die Organisation \"{orga.Name}\" hat keine gültige Bezeichnung Datenannahmestelle: \"{orga.BezDatenannahmestelle}\".";
if (error != null)
throw new GkvException(error);
}
public static bool IsOrganisationInformationValid(string ik_datenannahmestelle, string ik_kostentrager, string ik_krankenkasse, string bez_datenannahmestelle)
=> IsIKNumberValid(ik_datenannahmestelle, ik_kostentrager, ik_krankenkasse) && !string.IsNullOrEmpty(bez_datenannahmestelle);
public static bool IsCustomerValid(string insurance_number, string insurance_status)
=> IsVersichertennummerValid(insurance_number) && IsVersichertenstatusValid(insurance_status);
public static bool IsIKNumberValid(params string[] iks)
=> iks?.All(IsIKNumberValid) ?? false;
@@ -44,7 +92,6 @@ namespace BS.Shared.Core
return int.TryParse(iknummer, out int x);
}
public static bool IsVersichertennummerValid(string nummer)
{
if (nummer == null)
@@ -55,7 +102,6 @@ namespace BS.Shared.Core
return true;
}
public static bool IsVersichertenstatusValid(string status)
{
if (status == null)
@@ -66,7 +112,6 @@ namespace BS.Shared.Core
return true;
}
public static bool IsLeistungserbringergruppeValid(string code)
{
if (code == null)

View File

@@ -13,13 +13,17 @@ namespace BS.Shared.DataContracts
[DataContract]
public abstract class AppRequestDC : IDataContract
{
[DataMember] public string Tenant { get; set; }
[DataMember] public RequestType Type { get; set; }
public AppRequestDC(RequestType type, string tenant)
public AppRequestDC(RequestType type)
{
Type = type;
}
public AppRequestDC(RequestType type, string tenant) : this(type)
{
Tenant = tenant;
}
[DataMember] public string Tenant { get; set; }
[DataMember] public RequestType Type { get; set; }
}
}

View File

@@ -10,6 +10,9 @@ namespace BS.Shared.DataContracts.GkvAbrechnung
[DataContract]
public class GkvAbrechnungCreateResponseDC : GkvResponseDC
{
public GkvAbrechnungCreateResponseDC()
: base() { }
public GkvAbrechnungCreateResponseDC(bool success)
: base(success) { }

View File

@@ -10,6 +10,7 @@ namespace BS.Shared.DataContracts.GkvAbrechnung
[DataContract]
public class GkvAbrechnungGetIKResponseDC : GkvResponseDC
{
public GkvAbrechnungGetIKResponseDC() : base() { }
public GkvAbrechnungGetIKResponseDC(bool success) : base(success) { }
public GkvAbrechnungGetIKResponseDC(bool success, string message) : base(success, message) { }

View File

@@ -10,9 +10,12 @@ namespace BS.Shared.DataContracts.GkvAbrechnung
[DataContract]
public class GkvAbrechnungSendResponseDC : GkvResponseDC
{
public GkvAbrechnungSendResponseDC()
: base() { }
public GkvAbrechnungSendResponseDC(bool success)
: base(success) { }
public GkvAbrechnungSendResponseDC(bool success, string message)
: base(success, message) { }

View File

@@ -9,10 +9,11 @@ namespace BS.Shared.DataContracts.GkvAbrechnung
{
public class GkvClientResultRequestDC : GkvRequestDC
{
public GkvClientResultRequestDC(string tenant, string username, string password)
: base(RequestType.GkvClientResult, tenant, username, password) { }
public GkvClientResultRequestDC()
: base(RequestType.GkvClientResult) { }
[DataMember] public long Protokoll_Fehler_Oid;
[DataMember] public IList<long> Protokoll_Folgefehler_Oid;
[DataMember] public string GkvSecretKey { get; set; }
[DataMember] public long Protokoll_Fehler_Oid { get; set; }
[DataMember] public IList<long> Protokoll_Folgefehler_Oid { get; set; }
}
}

View File

@@ -7,16 +7,18 @@ using System.Threading.Tasks;
namespace BS.Shared.DataContracts.GkvAbrechnung
{
[DataContract]
public class GkvRequestDC : AppRequestDC
{
public GkvRequestDC(RequestType type, string tenant, string username, string password) : base(type, tenant)
{
Username = username;
Password = password;
}
[DataContract]
public class GkvRequestDC : AppRequestDC
{
public GkvRequestDC(RequestType type) : base(type) { }
[DataMember] public string Username { get; set; }
[DataMember] public string Password { get; set; }
}
public GkvRequestDC(RequestType type, string tenant, string username, string password) : base(type, tenant)
{
Username = username;
Password = password;
}
[DataMember] public string Username { get; set; }
[DataMember] public string Password { get; set; }
}
}

View File

@@ -10,6 +10,7 @@ namespace BS.Shared.DataContracts.GkvAbrechnung
[DataContract]
public class GkvResponseDC : AppResponseDC
{
public GkvResponseDC() : base(false) { }
public GkvResponseDC(bool success) : base(success) { }
public GkvResponseDC(bool success, string message) : base(success, message) { }
}

View File

@@ -9,6 +9,9 @@ namespace BS.Shared.DataContracts.GkvAbrechnung
{
public class GkvServerGetIKRequestDC : GkvRequestDC
{
public GkvServerGetIKRequestDC()
: base(RequestType.GkvServerGetIKNumber) { }
public GkvServerGetIKRequestDC(string tenant, string username, string password)
: base(RequestType.GkvServerGetIKNumber, tenant, username, password) { }

View File

@@ -9,6 +9,7 @@ namespace BS.Shared.DataContracts.GkvAbrechnung
{
public class GkvServerGetIKResponseDC : GkvResponseDC
{
public GkvServerGetIKResponseDC() : base() { }
public GkvServerGetIKResponseDC(bool success) : base(success) { }
public GkvServerGetIKResponseDC(bool success, string message) : base(success, message) { }

View File

@@ -9,6 +9,9 @@ namespace BS.Shared.DataContracts.GkvAbrechnung
{
public class GkvServerGetStatusRequestDC : GkvRequestDC
{
public GkvServerGetStatusRequestDC()
: base(RequestType.GkvServerGetStatus) { }
public GkvServerGetStatusRequestDC(string tenant, string username, string password)
: base(RequestType.GkvServerGetStatus, tenant, username, password) { }

View File

@@ -9,6 +9,9 @@ namespace BS.Shared.DataContracts.GkvAbrechnung
{
public class GkvServerSendNewRequestDC : GkvRequestDC
{
public GkvServerSendNewRequestDC()
: base(RequestType.GkvServerSendNew) { }
public GkvServerSendNewRequestDC(string tenant, string username, string password)
: base(RequestType.GkvServerSendNew, tenant, username, password) { }

View File

@@ -9,6 +9,9 @@ namespace BS.Shared.DataContracts.GkvAbrechnung
{
public class GkvServerSendNewResponseDC : GkvResponseDC
{
public GkvServerSendNewResponseDC()
: base() { }
public GkvServerSendNewResponseDC(bool success)
: base(success) { }