diff --git a/BeWo/View/Detail/Accounting/GkvAbrechnungOverview.xaml.cs b/BeWo/View/Detail/Accounting/GkvAbrechnungOverview.xaml.cs index e48c3c17c..0295def86 100644 --- a/BeWo/View/Detail/Accounting/GkvAbrechnungOverview.xaml.cs +++ b/BeWo/View/Detail/Accounting/GkvAbrechnungOverview.xaml.cs @@ -106,6 +106,8 @@ namespace BeWo.View.Detail.Accounting CriteriaOperator.FromLambda(gkv => gkv.AbrechnungsZeitraumStart <= filter_start && filter_ende <= gkv.AbrechnungsZeitraumEnde)); } } + + gridView.BestFitColumns(); } private void UpdateGkvAbrechnungList(IList dcList) @@ -120,8 +122,6 @@ namespace BeWo.View.Detail.Accounting datagrid_gkvAbrechnungen.Visibility = Visibility.Visible; UpdateDataGridFilter(); - - gridView.BestFitColumns(); }); @@ -233,7 +233,13 @@ namespace BeWo.View.Detail.Accounting var state = dc.GetState(); - var can_send = state == GkvState.NoSend || state == GkvState.Error; + var can_send = false; + + can_send |= state == GkvState.NoSend; + can_send |= state == GkvState.Error; +#if DEBUG + can_send |= state == GkvState.ErrorFatal; +#endif if (!can_send) { diff --git a/Host/GkvAbrechnungView.aspx.cs b/Host/GkvAbrechnungView.aspx.cs index 7df1774b2..0f867ea21 100644 --- a/Host/GkvAbrechnungView.aspx.cs +++ b/Host/GkvAbrechnungView.aspx.cs @@ -36,10 +36,14 @@ namespace Host { public partial class GkvAbrechnungView : Page { + public const int PROCESS_WAITFOREXIT_MS = 10 * 1000; + private string GETSERVER_URL = "https://support.bewoplaner.de/api/getserver.php?k={0}&t=0"; private string LOGINSERVER_URL = "{0}/Login.aspx"; - private string GkvAbrechnungResultFolderPath { get; set; } = ConfigurationManager.AppSettings.Get("GkvAbrechnungResultFolderPath"); + private string ResultFolderPath { get; set; } = ConfigurationManager.AppSettings.Get("GkvAbrechnungResultFolderPath"); + private string QueueFolderPath { get; set; } = ConfigurationManager.AppSettings.Get("GkvAbrechnungQueueFolderPath"); + private string DakotaPath { get; set; } = ConfigurationManager.AppSettings.Get("DakotaPath"); public GkvApp8Request GkvRequest { get; set; } @@ -139,7 +143,7 @@ namespace Host loginurl = string.Format(LOGINSERVER_URL, "http://localhost:3777/Host"); #endif - if (gkv_request.Tenant == "demo" && gkv_request.Username == "demo" && gkv_request.DebugMode == "fozc4897b6ztvf978AFCRRG244fvFV2532fvf324AF") + if (gkv_request.Tenant == "demo" && gkv_request.Username == "demo" && gkv_request.DebugMode == "fozc4897b6ztvf978AFCRRG244fvFV2532fvf324AF") return true; bool successful = false; @@ -158,7 +162,7 @@ namespace Host successful = BitConverter.ToBoolean(loginresponse, 0); } } - catch(Exception e) + catch (Exception e) { } @@ -168,38 +172,14 @@ namespace Host private void SendNew(GkvApp8SendNewRequest req) { - var debug_mode = false; - -#if DEBUG - debug_mode = true; -#endif - // Response var response = new GkvApp8SendNewResponse(false); - bool saved_in_filesystem = false; - bool send_success = false; + var protokoll = req.GkvTransferProtokoll; - string path = string.Empty; try { - //var test = System.Security.Principal.WindowsIdentity.GetCurrent().Name; - - //throw new DakotaException(test); - - // Check Dakota Status - CheckDakotaStatus(); - - // Save File - path = SaveFileInFileSystem(req, debug_mode); - saved_in_filesystem = true; - - if (req.SendDirect) - { - // Dakota Send - SendViaDakota(); - } - send_success = true; + SaveFileInFileSystem(req, true); req.GkvTransferProtokoll.SentSuccess = true; @@ -207,27 +187,24 @@ namespace Host } catch (DakotaException e) { - req.GkvTransferProtokoll.Fehlerdatum = DateTime.Now; - req.GkvTransferProtokoll.Fehlerlevel = GkvTransferFehlerlevel.Soft; - req.GkvTransferProtokoll.Fehlertitel = "App8"; - req.GkvTransferProtokoll.Fehlernachricht = e.Message; + protokoll.Fehlerdatum = DateTime.Now; + protokoll.Fehlerlevel = GkvTransferFehlerlevel.Soft; + protokoll.Fehlertitel = "App8"; + protokoll.Fehlernachricht = e.Message; response.Message = e.Message; } catch (Exception e) { - req.GkvTransferProtokoll.Fehlerdatum = DateTime.Now; - req.GkvTransferProtokoll.Fehlerlevel = GkvTransferFehlerlevel.Soft; - req.GkvTransferProtokoll.Fehlertitel = "App8"; - req.GkvTransferProtokoll.Fehlernachricht = e.Message; + protokoll.Fehlerdatum = DateTime.Now; + protokoll.Fehlerlevel = GkvTransferFehlerlevel.Soft; + protokoll.Fehlertitel = "App8"; + protokoll.Fehlernachricht = e.Message; response.Message = e.Message; } - if (!send_success && saved_in_filesystem) - DeleteFileInFileSystem(path); - - response.GkvTransferProtokollDC = req.GkvTransferProtokoll; + response.GkvTransferProtokollDC = protokoll; SendResponse(response); } @@ -244,15 +221,16 @@ namespace Host // Load XML Info var results = GetResultFile(req.Tenant); - for (int i = 0; i < tuple_count; i++) - { - var gkv_transfer_oid = req.Oids[i]; - - if (results.TryGetValue(gkv_transfer_oid, out var fehlerDC)) + if (results is object) + for (int i = 0; i < tuple_count; i++) { - response.Fehler[i] = fehlerDC; + var gkv_transfer_oid = req.Oids[i]; + + if (results.TryGetValue(gkv_transfer_oid, out var fehlerDC)) + { + response.Fehler[i] = fehlerDC; + } } - } response.Success = true; } @@ -283,7 +261,7 @@ namespace Host SendResponse(response); } - private void CheckDakotaStatus() => ExecuteDakota("-s", 0); + private void CheckDakotaStatus() => ExecuteDakota("-s", 0); private void SendViaDakota() => ExecuteDakota("-e", 0, 1); private int ExecuteDakota(string arg, params int[] accepted_return_codes) { @@ -291,7 +269,10 @@ namespace Host var process = Process.Start(path, arg); - process.WaitForExit(); + var success = process.WaitForExit(PROCESS_WAITFOREXIT_MS); + + if (!success) + throw new DakotaException($"Execute {arg} Timeout"); var returncode = process.ExitCode; @@ -303,21 +284,22 @@ namespace Host } private string SaveFileInFileSystem(GkvApp8SendNewRequest req, bool debug_mode = false) - => SaveFileInFileSystem(req.Tenant, req.GkvTransferProtokoll.IKDatenannahmestelle, req.GkvTransferProtokoll.Transfername, + => SaveFileInFileSystem(req.GkvTransferProtokoll.GkvTransferProtokollOid.Value, req.Tenant, req.GkvTransferProtokoll.IKDatenannahmestelle, req.GkvTransferProtokoll.Transfername, req.GkvTransferProtokoll.Nutzdatendatei, req.GkvTransferProtokoll.Auftragsdatei, debug_mode); - private string SaveFileInFileSystem(string tenant, string datenannahmestelle, string transfername, string nutzdaten, string auftragsdatei, bool debug_mode = false) + private string SaveFileInFileSystem(long protokoll_oid, string tenant, string datenannahmestelle, string transfername, string nutzdaten, string auftragsdatei, bool debug_mode = false) { string root_path; string file_path; if (debug_mode) { - root_path = $@"C:\GkvAbrechnung\"; - file_path = $@"{tenant}-{datenannahmestelle}-{transfername}"; + root_path = QueueFolderPath; + file_path = $@"{tenant}_{protokoll_oid}_{datenannahmestelle}_{transfername}"; } else { - root_path = $@"C:\GkvAbrechnung\{tenant}\{datenannahmestelle}\"; - file_path = $@"{transfername}"; + throw new DakotaException("No Debugmode impl"); + //root_path = $@"C:\GkvAbrechnung\{tenant}\{datenannahmestelle}\"; + //file_path = $@"{transfername}"; } Directory.CreateDirectory(root_path); @@ -369,16 +351,19 @@ namespace Host { try { - if (string.IsNullOrWhiteSpace(GkvAbrechnungResultFolderPath)) + var path = ResultFolderPath; + + if (string.IsNullOrWhiteSpace(path)) throw new DakotaException("Config GkvAbrechnungResultFolderPath is empty or whitespace"); if (string.IsNullOrWhiteSpace(tenant)) throw new DakotaException("Tenant is empty or whitespace"); - var path = GkvAbrechnungResultFolderPath; + var folder = path; + var location = Path.GetFullPath(Path.Combine(folder, $"{tenant}.results.xml")); - var folder = Path.Combine(path, tenant); - var location = Path.Combine(folder, "results.xml"); + if (!Directory.Exists(folder)) + Directory.CreateDirectory(folder); if (!File.Exists(location)) { @@ -386,20 +371,19 @@ namespace Host using (File.Create(location)) { }; return null; } - var doc = XDocument.Load(location); - var list = doc.Root.Elements("Fehler") + var list = doc?.Root?.Elements("Fehler")? .Select(GkvApp8FehlerXml.Parse) .Select(GkvApp8FehlerXml.ToDC) .ToList(); - return list.ToDictionary(dc => dc.Oid); + return list?.ToDictionary(dc => dc.Oid); } catch (Exception e) { - throw new DakotaException("App8 Server Error: " + e.Message); + throw new DakotaException("App8 Server Error: " + e.ToString()); } } } diff --git a/Host/Web.config b/Host/Web.config index d8fc0b00e..d3464fb9d 100644 --- a/Host/Web.config +++ b/Host/Web.config @@ -237,6 +237,7 @@ + diff --git a/Service/ServiceImplementations/AccountingServiceImp.cs b/Service/ServiceImplementations/AccountingServiceImp.cs index e1f0f3806..db664b0a0 100644 --- a/Service/ServiceImplementations/AccountingServiceImp.cs +++ b/Service/ServiceImplementations/AccountingServiceImp.cs @@ -865,6 +865,13 @@ namespace BeWo.Service.ServiceImplementations return response; } + if (entity.GkvTransferProtokolle is null) + entity.GkvTransferProtokolle = new List(); + + entity.GkvTransferProtokolle.Add(protokoll); + + DAOFactory.GenericDAO.Update(entity); + var app8_response = SendApp8SendNewRequest(protokoll, user.LoginName, user.RC2EncryptedHash); var app8_protokoll = app8_response.GkvTransferProtokollDC; @@ -888,11 +895,6 @@ namespace BeWo.Service.ServiceImplementations protokoll.Fehlertitel = "Erstellung (kritisch)"; } - if (entity.GkvTransferProtokolle is null) - entity.GkvTransferProtokolle = new List(); - - entity.GkvTransferProtokolle.Add(protokoll); - DAOFactory.GenericDAO.Update(entity); response.TransferProtokoll = MapperFactory.GkvTransferProtokollDC_GkvTransferprotokoll.MapToNewDC(protokoll); @@ -910,7 +912,7 @@ namespace BeWo.Service.ServiceImplementations var state = GkvAbrechnung.GetState(gkvAbrechnung); - if (state == GkvState.Waiting || state == GkvState.OldAndNoFeedback || state == GkvState.Paid || state == GkvState.ErrorFatal) + if (state == GkvState.Waiting || state == GkvState.OldAndNoFeedback || state == GkvState.Paid) { return false; } @@ -1008,7 +1010,7 @@ namespace BeWo.Service.ServiceImplementations { transfernummer = DAOFactory.SearchDAO.GetNextTransfernummer(datenannahmestelle); } - else if (state == GkvState.Error) + else if (state == GkvState.Error || state == GkvState.ErrorFatal) { transfernummer = gkvAbrechnung.GkvTransferProtokolle.Last().Transfernummer; } @@ -1076,16 +1078,13 @@ namespace BeWo.Service.ServiceImplementations var url = "https://app8.bewoplaner.de/service/GkvAbrechnungView.aspx"; -#if DEBUG - url = "http://localhost:3777/Host/GkvAbrechnungView.aspx"; -#endif - var request = new GkvApp8GetStatusRequest { Username = loginName, Password = hashed_password, Tenant = MultitenancyOperationContextExt.Current.Tenant, - Oids = new long[updateables_len] + Oids = new long[updateables_len], + DebugMode = "fozc4897b6ztvf978AFCRRG244fvFV2532fvf324AF", }; for (int id = 0; id < updateables_len; id++) @@ -1096,16 +1095,21 @@ namespace BeWo.Service.ServiceImplementations request.Oids[id] = gkv_transfer.GkvTransferProtokollOid.Value; } - var response_app8_str = SendApp8Request(url, JsonConvert.SerializeObject(request)); + GkvApp8GetStatusResponse response_app8; + try + { + var response_app8_str = SendApp8Request(url, JsonConvert.SerializeObject(request)); - var response_app8 = JsonConvert.DeserializeObject(response_app8_str); - - if (!response_app8.Success) + response_app8 = JsonConvert.DeserializeObject(response_app8_str); + } + catch(Exception e) { return true; - throw new NotImplementedException("App 8 Anfrage nicht erfolgreich"); } + if (!response_app8.Success) + throw new DakotaException(response_app8.Message); + bool allAreUpToDate = true; for (int id = 0; id < updateables_len; id++) {