Gkv GetNumber

This commit is contained in:
2025-11-11 12:10:16 +01:00
parent 3098bcfcfb
commit e664081e29
9 changed files with 178 additions and 9 deletions

View File

@@ -37,6 +37,8 @@
<Reference Include="System" />
<Reference Include="System.Configuration" />
<Reference Include="System.Core" />
<Reference Include="System.Memory, Version=4.0.1.2, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL" />
<Reference Include="System.Text.Json, Version=8.0.0.5, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
@@ -49,6 +51,7 @@
<Compile Include="DakotaUtils.cs" />
<Compile Include="Logic\DakotaKTDReader.cs" />
<Compile Include="Logic\DakotaManager.cs" />
<Compile Include="Logic\DakotaNumberManager.cs" />
<Compile Include="Models\Auftragsdatei\Auftragsdatei.cs" />
<Compile Include="Models\Auftragsdatei\AuftragssatzPart2.cs" />
<Compile Include="Models\Auftragsdatei\AuftragssatzPart3.cs" />

View File

@@ -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<string, Tuple<int, int>> _Numbers;
public DakotaNumberManager(string filePath)
{
_Filepath = filePath;
_Numbers = LoadNumbers();
}
private Dictionary<string, Tuple<int, int>> LoadNumbers()
{
if (!File.Exists(_Filepath))
{
return new Dictionary<string, Tuple<int, int>>
{
};
}
var json = File.ReadAllText(_Filepath);
return JsonSerializer.Deserialize<Dictionary<string, Tuple<int, int>>>(json) ?? new Dictionary<string, Tuple<int, int>>
{
};
}
private void SafeNumbers()
{
var json = JsonSerializer.Serialize(_Numbers, new JsonSerializerOptions()
{
WriteIndented = true
});
File.WriteAllText(_Filepath, json);
}
public Tuple<int, int> GetNextNumber(string datenannahmestelle, bool newDatenaustauschreferenz)
{
lock (_LockObj)
{
if (_Numbers.ContainsKey(datenannahmestelle))
{
var (datenaustauschreferenz, transfernummer) = _Numbers[datenannahmestelle];
if (newDatenaustauschreferenz)
datenaustauschreferenz++;
transfernummer++;
_Numbers[datenannahmestelle] = new Tuple<int, int>(datenaustauschreferenz, transfernummer);
}
else
{
_Numbers.Add(datenannahmestelle, new Tuple<int, int>(1, 0));
}
SafeNumbers();
return _Numbers[datenannahmestelle];
}
}
}
}

View File

@@ -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<GkvServerGetStatusRequestDC>(str, SendInvalidInputResponse));
return;
case RequestType.GkvServerGetNumber:
GetNumber(GkvSender.DeserializeRequest<GkvServerGetNumberRequestDC>(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)
{

View File

@@ -377,6 +377,7 @@
<add key="GkvAbrechnungResultFolderPath" value="C:\GkvAbrechnung\Results\" />
<add key="GkvAbrechnungQueueFolderPath" value="C:\GkvAbrechnung\Data\Queue\" />
<add key="GkvKostentragerdateiFolderPath" value="C:\GkvAbrechnung\KTDatei\" />
<add key="GkvAbrechnungRootPath" value="C:\GkvAbrechnung\" />
<add key="DakotaPath" value="C:\Program Files (x86)\ITSG\dakotale\dakota30.exe" />
<add key="App8IpAddress" value="88.198.50.220" />
<add key="GkvSumServerIPAdress" value="88.198.50.220" />

View File

@@ -488,25 +488,23 @@ namespace BeWo.Service.ServiceImplementations
private Tuple<int, int> 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<int, int>(datenaustauschref, transfernummer);
return SendApp8GetNumberRequest(datenannahmestelle, newDatenaustauschref, true);
}
private Tuple<int, int> ClearDatenaustauschreferenzTransfernummer(int datenaustauschreferenz, int transfernummer)
{
@@ -602,6 +600,34 @@ namespace BeWo.Service.ServiceImplementations
return false;
}
private Tuple<int, int> 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<GkvServerGetNumberRequestDC, GkvServerGetNumberResponseDC>(request);
return new Tuple<int, int>(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<GkvServerResultDC> results)
{
var protokolls = new List<GkvTransferProtokollLight>();

View File

@@ -1300,8 +1300,9 @@ namespace BS.Shared
GkvServerGetIKNumber,
GkvServerGetStatus,
GkvClientResult,
GkvClientSum
}
GkvClientSum,
GkvServerGetNumber,
}
public enum GkvTransferResultType
{

View File

@@ -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; }
}
}

View File

@@ -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; }
}
}

View File

@@ -187,6 +187,8 @@
<Compile Include="DataContracts\AdminService\AdminServiceSumResponseDetailDC.cs" />
<Compile Include="DataContracts\AdminService\IAdminServiceDC.cs" />
<Compile Include="DataContracts\AdminService\AdminServiceSumReqDC.cs" />
<Compile Include="DataContracts\Invoicing\GkvAbrechnung\GkvServerGetNumberRequestDC.cs" />
<Compile Include="DataContracts\Invoicing\GkvAbrechnung\GkvServerGetNumberResponseDC.cs" />
<Compile Include="DataContracts\Person2TeamDC.cs" />
<Compile Include="DataContracts\Feature\AI\AiConfigDC.cs" />
<Compile Include="DataContracts\Feature\AI\AiConversationDC.cs" />