From e664081e29abd856492e84f6ef77709db38e27df Mon Sep 17 00:00:00 2001 From: Rene Evertz Date: Tue, 11 Nov 2025 12:10:16 +0100 Subject: [PATCH] Gkv GetNumber --- Dakota/Dakota.csproj | 3 + Dakota/Logic/DakotaNumberManager.cs | 76 +++++++++++++++++++ Host/GkvAbrechnungServer.aspx.cs | 21 ++++- Host/Web.config | 1 + .../GkvAccountingServiceImp.cs | 38 ++++++++-- Shared/BeWoEntityEnums.cs | 5 +- .../GkvServerGetNumberRequestDC.cs | 22 ++++++ .../GkvServerGetNumberResponseDC.cs | 19 +++++ Shared/Shared.csproj | 2 + 9 files changed, 178 insertions(+), 9 deletions(-) create mode 100644 Dakota/Logic/DakotaNumberManager.cs create mode 100644 Shared/DataContracts/Invoicing/GkvAbrechnung/GkvServerGetNumberRequestDC.cs create mode 100644 Shared/DataContracts/Invoicing/GkvAbrechnung/GkvServerGetNumberResponseDC.cs 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 @@ + +