diff --git a/Dakota/Dakota.csproj b/Dakota/Dakota.csproj
index 1a023788c..0e127fdbb 100644
--- a/Dakota/Dakota.csproj
+++ b/Dakota/Dakota.csproj
@@ -37,6 +37,8 @@
+
+
@@ -49,6 +51,7 @@
+
diff --git a/Dakota/Logic/DakotaNumberManager.cs b/Dakota/Logic/DakotaNumberManager.cs
new file mode 100644
index 000000000..660cc48a6
--- /dev/null
+++ b/Dakota/Logic/DakotaNumberManager.cs
@@ -0,0 +1,76 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Text.Json;
+using System.Threading.Tasks;
+
+namespace Dakota.Logic
+{
+ public class DakotaNumberManager
+ {
+ private readonly string _Filepath;
+ private readonly object _LockObj = new object();
+ private Dictionary> _Numbers;
+
+ public DakotaNumberManager(string filePath)
+ {
+ _Filepath = filePath;
+ _Numbers = LoadNumbers();
+ }
+
+ private Dictionary> LoadNumbers()
+ {
+ if (!File.Exists(_Filepath))
+ {
+ return new Dictionary>
+ {
+
+ };
+ }
+
+ var json = File.ReadAllText(_Filepath);
+
+ return JsonSerializer.Deserialize>>(json) ?? new Dictionary>
+ {
+
+ };
+ }
+
+ private void SafeNumbers()
+ {
+ var json = JsonSerializer.Serialize(_Numbers, new JsonSerializerOptions()
+ {
+ WriteIndented = true
+ });
+ File.WriteAllText(_Filepath, json);
+ }
+
+ public Tuple GetNextNumber(string datenannahmestelle, bool newDatenaustauschreferenz)
+ {
+ lock (_LockObj)
+ {
+ if (_Numbers.ContainsKey(datenannahmestelle))
+ {
+ var (datenaustauschreferenz, transfernummer) = _Numbers[datenannahmestelle];
+
+ if (newDatenaustauschreferenz)
+ datenaustauschreferenz++;
+
+ transfernummer++;
+
+ _Numbers[datenannahmestelle] = new Tuple(datenaustauschreferenz, transfernummer);
+ }
+ else
+ {
+ _Numbers.Add(datenannahmestelle, new Tuple(1, 0));
+ }
+
+ SafeNumbers();
+
+ return _Numbers[datenannahmestelle];
+ }
+ }
+ }
+}
diff --git a/Host/GkvAbrechnungServer.aspx.cs b/Host/GkvAbrechnungServer.aspx.cs
index 92b75c054..58e5c0817 100644
--- a/Host/GkvAbrechnungServer.aspx.cs
+++ b/Host/GkvAbrechnungServer.aspx.cs
@@ -36,7 +36,7 @@ namespace Host
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");
-
+
protected void Page_Load(object sender, EventArgs e)
{
try
@@ -67,6 +67,10 @@ namespace Host
GetStatus(GkvSender.DeserializeRequest(str, SendInvalidInputResponse));
return;
+ case RequestType.GkvServerGetNumber:
+ GetNumber(GkvSender.DeserializeRequest(str, SendInvalidInputResponse));
+ return;
+
default:
SendErrorResponse("RequestType unbekannt.");
return;
@@ -245,6 +249,21 @@ namespace Host
return;
}
+ private void GetNumber(GkvServerGetNumberRequestDC req)
+ {
+ var response = new GkvServerGetNumberResponseDC(false);
+
+ var path = ConfigurationManager.AppSettings.Get("GkvAbrechnungRootPath");
+ var filePath = Path.Combine(path, "numbers.json");
+ var manager = new DakotaNumberManager(filePath);
+
+ (response.Datenaustauschreferenz, response.Transfernummer)
+ = manager.GetNextNumber(req.IKDatenannahmestelle, req.NewDatenaustauschRef);
+
+ SendResponse(response);
+
+ return;
+ }
private string SaveFileInQueue(GkvServerSendNewRequestDC req)
{
diff --git a/Host/Web.config b/Host/Web.config
index 9e7ce8186..5b3a3b539 100644
--- a/Host/Web.config
+++ b/Host/Web.config
@@ -377,6 +377,7 @@
+
diff --git a/Service/ServiceImplementations/GkvAccountingServiceImp.cs b/Service/ServiceImplementations/GkvAccountingServiceImp.cs
index a64a0ffc5..f7a560b88 100644
--- a/Service/ServiceImplementations/GkvAccountingServiceImp.cs
+++ b/Service/ServiceImplementations/GkvAccountingServiceImp.cs
@@ -488,25 +488,23 @@ namespace BeWo.Service.ServiceImplementations
private Tuple GetNextDatenaustauschreferenzTransfernummer(GkvAbrechnung gkvAbrechnung, string datenannahmestelle)
{
- var datenaustauschref = DAOFactory.SearchDAO.GetNextDatenaustauschreferenz(datenannahmestelle);
- int transfernummer;
-
+ bool newDatenaustauschref;
var state = gkvAbrechnung.GetState();
if (state == GkvState.NoSend)
{
- transfernummer = DAOFactory.SearchDAO.GetNextTransfernummer(datenannahmestelle);
+ newDatenaustauschref = false;
}
else if (state == GkvState.ErrorSoft || state == GkvState.ErrorFatal || state == GkvState.ErrorFolgefehler)
{
- transfernummer = gkvAbrechnung.GkvTransferProtokolle.Last().Transfernummer;
+ newDatenaustauschref = true;
}
else
{
throw new ArgumentException($"Versucht Transfernummer zu laden, invalid state: {state}", nameof(state));
}
- return new Tuple(datenaustauschref, transfernummer);
+ return SendApp8GetNumberRequest(datenannahmestelle, newDatenaustauschref, true);
}
private Tuple ClearDatenaustauschreferenzTransfernummer(int datenaustauschreferenz, int transfernummer)
{
@@ -602,6 +600,34 @@ namespace BeWo.Service.ServiceImplementations
return false;
}
+ private Tuple SendApp8GetNumberRequest(string ik_datenannahmestelle, bool newDatenaustauschref, bool newTransferNumber)
+ {
+ var request = new GkvServerGetNumberRequestDC();
+
+ request.IKDatenannahmestelle = ik_datenannahmestelle;
+ request.NewDatenaustauschRef = newDatenaustauschref;
+ request.NewTransferNumber = newTransferNumber;
+
+ GkvServerGetNumberResponseDC response_app8;
+
+ response_app8 = SendApp8Request(request);
+
+ return new Tuple(response_app8.Datenaustauschreferenz, response_app8.Transfernummer);
+
+ // Kein Try-Catch, damit der Prozess oben abgebrochen wird
+
+ //try
+ //{
+
+ //}
+ //catch (Exception e)
+ //{
+ // MailUtils.SendGkvModuleErrorMail("GkvServerGetNumberRequest Error", e, Tenant);
+ //}
+
+ //return null;
+ }
+
public void HandleGkvServerResults(IEnumerable results)
{
var protokolls = new List();
diff --git a/Shared/BeWoEntityEnums.cs b/Shared/BeWoEntityEnums.cs
index 0df7a48c9..7a663982b 100644
--- a/Shared/BeWoEntityEnums.cs
+++ b/Shared/BeWoEntityEnums.cs
@@ -1300,8 +1300,9 @@ namespace BS.Shared
GkvServerGetIKNumber,
GkvServerGetStatus,
GkvClientResult,
- GkvClientSum
- }
+ GkvClientSum,
+ GkvServerGetNumber,
+ }
public enum GkvTransferResultType
{
diff --git a/Shared/DataContracts/Invoicing/GkvAbrechnung/GkvServerGetNumberRequestDC.cs b/Shared/DataContracts/Invoicing/GkvAbrechnung/GkvServerGetNumberRequestDC.cs
new file mode 100644
index 000000000..bf7ac4084
--- /dev/null
+++ b/Shared/DataContracts/Invoicing/GkvAbrechnung/GkvServerGetNumberRequestDC.cs
@@ -0,0 +1,22 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Runtime.Serialization;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace BS.Shared.DataContracts.GkvAbrechnung
+{
+ public class GkvServerGetNumberRequestDC : GkvServerRequestDC
+ {
+ public GkvServerGetNumberRequestDC()
+ : base(RequestType.GkvServerGetNumber) { }
+
+ public GkvServerGetNumberRequestDC(string tenant, string username, string password)
+ : base(RequestType.GkvServerGetNumber, tenant, username, password) { }
+
+ [DataMember] public string IKDatenannahmestelle { get; set; }
+ [DataMember] public bool NewDatenaustauschRef { get; set; }
+ [DataMember] public bool NewTransferNumber { get; set; }
+ }
+}
diff --git a/Shared/DataContracts/Invoicing/GkvAbrechnung/GkvServerGetNumberResponseDC.cs b/Shared/DataContracts/Invoicing/GkvAbrechnung/GkvServerGetNumberResponseDC.cs
new file mode 100644
index 000000000..0a9757965
--- /dev/null
+++ b/Shared/DataContracts/Invoicing/GkvAbrechnung/GkvServerGetNumberResponseDC.cs
@@ -0,0 +1,19 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Runtime.Serialization;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace BS.Shared.DataContracts.GkvAbrechnung
+{
+ public class GkvServerGetNumberResponseDC : GkvResponseDC
+ {
+ public GkvServerGetNumberResponseDC() : base() { }
+ public GkvServerGetNumberResponseDC(bool success) : base(success) { }
+ public GkvServerGetNumberResponseDC(bool success, string message) : base(success, message) { }
+
+ [DataMember] public int Datenaustauschreferenz { get; set; }
+ [DataMember] public int Transfernummer { get; set; }
+ }
+}
diff --git a/Shared/Shared.csproj b/Shared/Shared.csproj
index 4b8736e97..00d94001b 100644
--- a/Shared/Shared.csproj
+++ b/Shared/Shared.csproj
@@ -187,6 +187,8 @@
+
+