From c817b1eacf1dd0ecf0946c86d564ca423ec407c6 Mon Sep 17 00:00:00 2001 From: Rene Evertz Date: Tue, 7 May 2024 16:55:53 +0200 Subject: [PATCH] =?UTF-8?q?-=20GesendetAm=20Feld=20hinzugef=C3=BCgt=20-=20?= =?UTF-8?q?GesendetDisplay=20mit=20Senden=20und=20Fehlgeschlagen=20->=20er?= =?UTF-8?q?ste=20Fehlererkennung=20-=20Erneutes=20Senden=20bekommt=20spezi?= =?UTF-8?q?ellen=20Text=20-=20Bezahlt=20Flag=20Fehler?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Accounting/GkvAbrechnungOverview.xaml | 7 +- .../Accounting/GkvAbrechnungOverview.xaml.cs | 46 ++++++++++- .../NewGkvAbrechnungPopUpView .xaml | 2 +- BeWo/ViewModel/GkvAbrechnungVM.cs | 82 ++++++++++++++++++- Data/Entities/GkvAbrechnung.cs | 2 + Data/Mappings/GkvAbrechnung.hbm.xml | 5 +- Host/GkvAbrechnungView.aspx.cs | 22 +++-- .../Changes_2024_05_07_GkvAbrechnung_neu.txt | 31 +++++++ .../GkvAbrechnungDC_GkvAbrechnung.cs | 4 +- .../AccountingServiceImp.cs | 32 ++++++-- .../GkvAbrechnung/GkvAbrechnungDC.cs | 3 + .../GkvAbrechnungSendResponseDC.cs | 3 + 12 files changed, 211 insertions(+), 28 deletions(-) create mode 100644 Model/Changes_2024_05_07_GkvAbrechnung_neu.txt diff --git a/BeWo/View/Detail/Accounting/GkvAbrechnungOverview.xaml b/BeWo/View/Detail/Accounting/GkvAbrechnungOverview.xaml index ce2275109..ae92b239c 100644 --- a/BeWo/View/Detail/Accounting/GkvAbrechnungOverview.xaml +++ b/BeWo/View/Detail/Accounting/GkvAbrechnungOverview.xaml @@ -41,7 +41,7 @@ - + @@ -113,6 +113,11 @@ + + + + + diff --git a/BeWo/View/Detail/Accounting/GkvAbrechnungOverview.xaml.cs b/BeWo/View/Detail/Accounting/GkvAbrechnungOverview.xaml.cs index 3b8568443..2b075ed1d 100644 --- a/BeWo/View/Detail/Accounting/GkvAbrechnungOverview.xaml.cs +++ b/BeWo/View/Detail/Accounting/GkvAbrechnungOverview.xaml.cs @@ -184,13 +184,49 @@ namespace BeWo.View.Detail.Accounting { var vm = datagrid_gkvAbrechnungen.GetCurrentValue(); - if (MessageBox.Show("Sind Sie sicher, dass Sie die gewählte GKV-Abrechnung senden möchten?", "GKV-Abrechnung senden", MessageBoxButton.YesNo, MessageBoxImage.Warning) == MessageBoxResult.Yes) + string text; + + if (vm.GesendetAm.HasValue) + text = "Die gewählte GKV-Abrechnung wurde bereits gesendet. Möchten Sie sie erneut senden?"; + else + text = "Sind Sie sicher, dass Sie die gewählte GKV-Abrechnung senden möchten?"; + + if (MessageBox.Show(text, "GKV-Abrechnung senden", MessageBoxButton.YesNo, MessageBoxImage.Warning) == MessageBoxResult.Yes) { + vm.IsSendingRequestCurrently = true; + vm.SendAndFailed = false; + var req = new GkvAbrechnungSendRequestDC(); req.GkvAbrechnungDC = vm.CommitToDataContract(); - ServiceFacade.DoAccountingServiceAsync(s => s.SendNewGkvAbrechnung(req)); + ServiceFacade.DoAccountingServiceAsync(s => s.SendNewGkvAbrechnung(req), + cb => + { + Dispatcher.BeginInvoke(DispatcherPriority.Normal, (Action)(() => + { + vm.IsSendingRequestCurrently = false; + + if (cb.Successful) + { + var dc = cb.GkvAbrechnungDC; + + vm.GkvAbrechnungVersion = dc.GkvAbrechnungVersion; + + vm.GesendetAm = dc.GesendetAm; + vm.AntwortEntschluesseltAm = dc.AntwortEntschluesseltAm; + vm.AntwortErhaltenAm = dc.AntwortErhaltenAm; + vm.UebertragenAm = dc.UebertragenAm; + vm.VerschluesseltAm = dc.VerschluesseltAm; + } + else + { + vm.SendAndFailed = true; + + MessageBox.Show(cb.Message); + } + })); + }, false); } } private void btn_delete_Click(object sender, RoutedEventArgs e) @@ -271,14 +307,16 @@ namespace BeWo.View.Detail.Accounting var dc = ServiceFacade.DoAccountingServiceSync(x => x.UpdateGkvAbrechnung(dc_in)); - vm.Update(dc); + vm.GkvAbrechnungVersion = dc.GkvAbrechnungVersion; + vm.Bezahlt = dc.Bezahlt; } private void SaveNoticeChange(GkvAbrechnungVM vm, string notice) { var dc = ServiceFacade.DoAccountingServiceSync(x => x.UpdateGkvAbrechnung(vm.CommitToDataContract())); - vm.Update(dc); + vm.GkvAbrechnungVersion = dc.GkvAbrechnungVersion; + vm.Notice = dc.Notice; } private void gridView_CellValueChanged_1(object sender, CellValueChangedEventArgs e) diff --git a/BeWo/View/Detail/Accounting/NewGkvAbrechnungPopUpView .xaml b/BeWo/View/Detail/Accounting/NewGkvAbrechnungPopUpView .xaml index 5ac05bf6f..ebe4ad221 100644 --- a/BeWo/View/Detail/Accounting/NewGkvAbrechnungPopUpView .xaml +++ b/BeWo/View/Detail/Accounting/NewGkvAbrechnungPopUpView .xaml @@ -91,7 +91,7 @@ - + diff --git a/BeWo/ViewModel/GkvAbrechnungVM.cs b/BeWo/ViewModel/GkvAbrechnungVM.cs index a9b44ecdf..00ab0cef7 100644 --- a/BeWo/ViewModel/GkvAbrechnungVM.cs +++ b/BeWo/ViewModel/GkvAbrechnungVM.cs @@ -36,6 +36,7 @@ AntwortEntschluesseltAm public static string PropertyName_Auftragsdatei = "Auftragsdatei"; public static string PropertyName_Transfername = "Transfername"; + public static string PropertyName_GesendetAm = "GesendetAm"; public static string PropertyName_ErstelltAm = "ErstelltAm"; public static string PropertyName_VerschluesseltAm = "VerschluesseltAm"; public static string PropertyName_UebertragenAm = "UebertragenAm"; @@ -59,6 +60,7 @@ AntwortEntschluesseltAm private string _Transfername; private int _Datenaustauschreferenz; + private DateTime? _GesendetAm; private DateTime? _ErstelltAm; private DateTime? _VerschluesseltAm; private DateTime? _UebertragenAm; @@ -69,6 +71,8 @@ AntwortEntschluesseltAm private bool _Bezahlt; internal bool _IsChecked; + internal bool _IsSendingRequestCurrently; + internal bool _SendAndFailed; private List _InvoiceBases2; private BindingList _InvoiceBases; @@ -262,6 +266,41 @@ AntwortEntschluesseltAm } } + [Validation(ValidationRule = ValidationRules.NotNullOrStringEmpty)] + + public string GesendetDisplay + { + get + { + if (IsSendingRequestCurrently) + return "Sendet"; + + if (SendAndFailed) + return "Fehlgeschlagen"; + + if (GesendetAm.HasValue) + return GesendetAm.Value.ToString(); + else + return "-"; + } + } + + public DateTime? GesendetAm + { + get { return this._GesendetAm; } + + set + { + if (this.AreDifferent(this._GesendetAm, value)) + { + this._GesendetAm = value; + this.StoreDirtyInformation(this.AreDifferent(this.DataContract.GesendetAm, value), nameof(GesendetAm)); + this.FirePropertyChanged(nameof(GesendetAm)); + this.FirePropertyChanged(nameof(GesendetDisplay)); + } + } + } + [Validation(ValidationRule = ValidationRules.NotNullOrStringEmpty)] public DateTime? VerschluesseltAm { @@ -419,6 +458,36 @@ AntwortEntschluesseltAm } } + public bool IsSendingRequestCurrently + { + get { return _IsSendingRequestCurrently; } + + set + { + if (AreDifferent(_IsSendingRequestCurrently, value)) + { + _IsSendingRequestCurrently = value; + FirePropertyChanged("IsSendingRequestCurrently"); + FirePropertyChanged("GesendetDisplay"); + } + } + } + + public bool SendAndFailed + { + get { return _SendAndFailed; } + + set + { + if (AreDifferent(_SendAndFailed, value)) + { + _SendAndFailed = value; + FirePropertyChanged("SendAndFailed"); + FirePropertyChanged("GesendetDisplay"); + } + } + } + public List InvoiceBases2 { get { return _InvoiceBases2; } @@ -478,6 +547,7 @@ AntwortEntschluesseltAm _AntwortEntschluesseltAm = pDataContract.AntwortEntschluesseltAm; _ErstelltAm = pDataContract.ErstelltAm; _Datenaustauschreferenz = pDataContract.Datenaustauschreferenz; + _GesendetAm = pDataContract.GesendetAm; _GkvAbrechnungOid = pDataContract.GkvAbrechnungOid; _GkvAbrechnungVersion = pDataContract.GkvAbrechnungVersion; @@ -505,11 +575,14 @@ AntwortEntschluesseltAm pDataContract.Nutzdatendatei = _Nutzdatendatei; pDataContract.Auftragsdatei = _Auftragsdatei; pDataContract.Transfername = _Transfername; + pDataContract.VerschluesseltAm = _VerschluesseltAm; pDataContract.UebertragenAm = _UebertragenAm; pDataContract.AntwortErhaltenAm = _AntwortErhaltenAm; pDataContract.AntwortEntschluesseltAm = _AntwortEntschluesseltAm; pDataContract.ErstelltAm = _ErstelltAm; + pDataContract.GesendetAm = _GesendetAm; + pDataContract.GkvAbrechnungOid = _GkvAbrechnungOid; pDataContract.GkvAbrechnungVersion = _GkvAbrechnungVersion; @@ -530,10 +603,11 @@ AntwortEntschluesseltAm Notice = dc.Notice; Bezahlt = dc.Bezahlt; - if(Notice != dc.Notice || Bezahlt != dc.Bezahlt) - { - throw new NotImplementedException("Notiz/Bezahlt wurde nicht korrekt übernommen"); - } + VerschluesseltAm = dc.VerschluesseltAm; + UebertragenAm = dc.UebertragenAm; + AntwortErhaltenAm = dc.AntwortErhaltenAm; + AntwortEntschluesseltAm = dc.AntwortEntschluesseltAm; + GesendetAm = dc.GesendetAm; } } } \ No newline at end of file diff --git a/Data/Entities/GkvAbrechnung.cs b/Data/Entities/GkvAbrechnung.cs index abf98dfd3..7353934b1 100644 --- a/Data/Entities/GkvAbrechnung.cs +++ b/Data/Entities/GkvAbrechnung.cs @@ -36,6 +36,8 @@ namespace BeWo.Data.Entities public virtual DateTime? ErstelltAm { get; set; } + public virtual DateTime? GesendetAm { get; set; } + public virtual DateTime? VerschluesseltAm { get; set; } public virtual DateTime? UebertragenAm { get; set; } diff --git a/Data/Mappings/GkvAbrechnung.hbm.xml b/Data/Mappings/GkvAbrechnung.hbm.xml index 5ef3b69c2..50a795b81 100644 --- a/Data/Mappings/GkvAbrechnung.hbm.xml +++ b/Data/Mappings/GkvAbrechnung.hbm.xml @@ -17,8 +17,9 @@ - - + + + diff --git a/Host/GkvAbrechnungView.aspx.cs b/Host/GkvAbrechnungView.aspx.cs index d8f7fdf3c..e1f173b8b 100644 --- a/Host/GkvAbrechnungView.aspx.cs +++ b/Host/GkvAbrechnungView.aspx.cs @@ -25,6 +25,7 @@ using BeWo.Data.Access; using BeWo.Service.DCEntityMapper; using BeWo.Data.Entities; using BS.Shared.Extensions; +using System.Threading; namespace Host { @@ -69,6 +70,12 @@ namespace Host SendErrorResponse("GkvAbrechnungType unbekannt."); return; } + + SendErrorResponse("Unbekannter Fehler"); + } + catch(ThreadAbortException eee) + { + } catch (Exception ex) { @@ -76,8 +83,6 @@ namespace Host SendErrorResponse(ex_text); return; } - - SendErrorResponse("Unbekannter Fehler"); } private void SendErrorResponse(string message) @@ -94,7 +99,8 @@ namespace Host { Response.Write(str); - Context.ApplicationInstance.CompleteRequest(); + Response.End(); + //Context.ApplicationInstance.CompleteRequest(); } private bool CheckValues() => CheckValues(GkvRequest); @@ -150,11 +156,11 @@ namespace Host SaveFileInFileSystem(req, debug_mode); // Make DB Entry - var entry = MapperFactory.GkvAbrechnungDC_GkvAbrechnung.MapToNewEntity(req.GkvAbrechnung); + //var entry = MapperFactory.GkvAbrechnungDC_GkvAbrechnung.MapToNewEntity(req.GkvAbrechnung); - entry.Kundennummer = req.Tenant; + //entry.Kundennummer = req.Tenant; - DAOFactory.GenericDAO.Insert(entry); + // DAOFactory.GenericDAO.Insert(entry); // Dakota Send @@ -200,7 +206,9 @@ namespace Host // Get Entry var entries = DAOFactory.GenericDAO.GetAllActive(); - var tuples = req.Tuples; + entries.DoForEach(x => x.Kundennummer = req.Kundennummer); + + var tuples =req.Tuples; var tuples_len = tuples.Length; var response_tuples = new Tuple[tuples_len]; diff --git a/Model/Changes_2024_05_07_GkvAbrechnung_neu.txt b/Model/Changes_2024_05_07_GkvAbrechnung_neu.txt new file mode 100644 index 000000000..b4cbee642 --- /dev/null +++ b/Model/Changes_2024_05_07_GkvAbrechnung_neu.txt @@ -0,0 +1,31 @@ +CREATE TABLE `gkvabrechnung` ( + `Oid` bigint NOT NULL AUTO_INCREMENT, + `Tid` int NOT NULL, + `Notice` varchar(1024) DEFAULT NULL, + `InsTs` datetime DEFAULT NULL, + `InsUser` varchar(256) DEFAULT NULL, + `Version` bigint DEFAULT NULL, + `UdpUser` varchar(256) DEFAULT NULL, + `IsActive` tinyint DEFAULT NULL, + `SystemEntryID` int DEFAULT NULL, + `Kundennummer` varchar(256) DEFAULT NULL, + `IKLeistungserbringer` varchar(256) DEFAULT NULL, + `IKVersichertenKarte` varchar(256) DEFAULT NULL, + `IKKostentrager` varchar(256) DEFAULT NULL, + `IKDatenannahmestelle` varchar(256) DEFAULT NULL, + `AbrechnungsZeitraumStart` datetime DEFAULT NULL, + `AbrechnungsZeitraumEnde` datetime DEFAULT NULL, + `Nutzdatendatei` text, + `Auftragsdatei` varchar(1024) DEFAULT NULL, + `Transfername` varchar(256) DEFAULT NULL, + `Datenaustauschreferenz` int DEFAULT NULL, + `ErstelltAm` datetime DEFAULT NULL, + `GesendetAm` datetime DEFAULT NULL, + `VerschluesseltAm` datetime DEFAULT NULL, + `UebertragenAm` datetime DEFAULT NULL, + `AntwortErhaltenAm` datetime DEFAULT NULL, + `AntwortEntschluesseltAm` datetime DEFAULT NULL, + `Betrag` decimal(18,10) DEFAULT NULL, + `Bezahlt` tinyint DEFAULT NULL, + PRIMARY KEY (`Oid`) +) ENGINE=InnoDB AUTO_INCREMENT=37 DEFAULT CHARSET=latin1 \ No newline at end of file diff --git a/Service/DCEntityMapper/GkvAbrechnungDC_GkvAbrechnung.cs b/Service/DCEntityMapper/GkvAbrechnungDC_GkvAbrechnung.cs index 725b7176f..9097099dc 100644 --- a/Service/DCEntityMapper/GkvAbrechnungDC_GkvAbrechnung.cs +++ b/Service/DCEntityMapper/GkvAbrechnungDC_GkvAbrechnung.cs @@ -32,11 +32,12 @@ namespace BeWo.Service.DCEntityMapper pDataContract.Transfername = pEntity.Transfername; pDataContract.Datenaustauschreferenz = pEntity.Datenaustauschreferenz; - pDataContract.UebertragenAm = pEntity.UebertragenAm; + pDataContract.VerschluesseltAm = pEntity.VerschluesseltAm; pDataContract.AntwortErhaltenAm = pEntity.AntwortErhaltenAm; pDataContract.AntwortEntschluesseltAm = pEntity.AntwortEntschluesseltAm; pDataContract.UebertragenAm = pEntity.UebertragenAm; pDataContract.ErstelltAm = pEntity.ErstelltAm; + pDataContract.GesendetAm = pEntity.GesendetAm; pDataContract.Betrag = pEntity.Betrag; pDataContract.Bezahlt = pEntity.Bezahlt; @@ -70,6 +71,7 @@ namespace BeWo.Service.DCEntityMapper pEntity.Datenaustauschreferenz = pDataContract.Datenaustauschreferenz; pEntity.ErstelltAm = pDataContract.ErstelltAm; + pEntity.GesendetAm = pDataContract.GesendetAm; pEntity.VerschluesseltAm = pDataContract.VerschluesseltAm; pEntity.UebertragenAm = pDataContract.UebertragenAm; pEntity.AntwortErhaltenAm = pDataContract.AntwortErhaltenAm; diff --git a/Service/ServiceImplementations/AccountingServiceImp.cs b/Service/ServiceImplementations/AccountingServiceImp.cs index 20a1b657b..a76d2a79a 100644 --- a/Service/ServiceImplementations/AccountingServiceImp.cs +++ b/Service/ServiceImplementations/AccountingServiceImp.cs @@ -720,7 +720,7 @@ namespace BeWo.Service.ServiceImplementations var dcs = MapperFactory.GkvAbrechnungDC_GkvAbrechnung.MapToNewDCs(entries); - var updateables = dcs.Where(x => !x.IsStatusComplete()).ToArray(); + var updateables = dcs.Where(x => !x.IsStatusComplete() && x.GesendetAm.HasValue).ToArray(); var isUpToDate = SendApp8GetStatusRequest(updateables, user.LoginName, user.RC2EncryptedHash); @@ -770,10 +770,15 @@ namespace BeWo.Service.ServiceImplementations request.Tuples[id] = new Tuple(gkv_abrechnung, gkv_abrechnung_oid); } - var response_app8_str = SendApp8Request(url, request); + var response_app8_str = SendApp8Request(url, JsonConvert.SerializeObject(request)); var response_app8 = JsonConvert.DeserializeObject(response_app8_str); + if (!response_app8.Success) + { + throw new NotImplementedException("App 8 Anfrage nicht erfolgreich"); + } + bool allAreUpToDate = true; for (int id = 0; id < updateables_len; id++) { @@ -978,10 +983,22 @@ namespace BeWo.Service.ServiceImplementations response.Successful = response_app8.Success; - if (!response.Successful) - response.Message = response_app8.Message; - else + if (response_app8.Success) + { + var entity = DAOFactory.GenericDAO.GetByID(req.GkvAbrechnungDC.GkvAbrechnungOid.Value); + + entity.GesendetAm = DateTime.Now; + + DAOFactory.GenericDAO.Update(entity); + response.Message = "Erfolgreich gesendet"; + response.GkvAbrechnungDC = MapperFactory.GkvAbrechnungDC_GkvAbrechnung.MapToNewDC(entity); + } + else + { + response.Message = response_app8.Message; + } + return response; } @@ -989,8 +1006,6 @@ namespace BeWo.Service.ServiceImplementations { throw Utils.CreateBeWoFaultException(e); } - - throw new NotImplementedException(); } private string SendApp8SendNewRequest(long oid, string loginName, string hashed_password) { @@ -1004,7 +1019,6 @@ namespace BeWo.Service.ServiceImplementations var request_app8 = new GkvApp8SendNewRequest { GkvAbrechnung = gkv_abrechnung_dc, - Type = GkvAbrechnungApp8RequestTypeDC.SendNew, Username = loginName, Password = hashed_password, Tenant = MultitenancyOperationContextExt.Current.Tenant @@ -1016,6 +1030,8 @@ namespace BeWo.Service.ServiceImplementations private string SendApp8Request(string url, object request) => SendApp8Request(url, JsonConvert.SerializeObject(request)); private string SendApp8Request(string url, string dataString) { + url += "?tenant=" + MultitenancyOperationContextExt.Current.Tenant; + string response_app8_str; using (WebClient client = new WebClient()) { diff --git a/Shared/DataContracts/GkvAbrechnung/GkvAbrechnungDC.cs b/Shared/DataContracts/GkvAbrechnung/GkvAbrechnungDC.cs index 6a99a3716..7f8d0fd30 100644 --- a/Shared/DataContracts/GkvAbrechnung/GkvAbrechnungDC.cs +++ b/Shared/DataContracts/GkvAbrechnung/GkvAbrechnungDC.cs @@ -50,6 +50,9 @@ namespace BS.Shared.DataContracts.GkvAbrechnung [DataMember] public DateTime? ErstelltAm { get; set; } + [DataMember] + public DateTime? GesendetAm { get; set; } + [DataMember] public DateTime? VerschluesseltAm { get; set; } diff --git a/Shared/DataContracts/GkvAbrechnung/GkvAbrechnungSendResponseDC.cs b/Shared/DataContracts/GkvAbrechnung/GkvAbrechnungSendResponseDC.cs index 38422a4f2..fd3e073d7 100644 --- a/Shared/DataContracts/GkvAbrechnung/GkvAbrechnungSendResponseDC.cs +++ b/Shared/DataContracts/GkvAbrechnung/GkvAbrechnungSendResponseDC.cs @@ -15,5 +15,8 @@ namespace BS.Shared.DataContracts.GkvAbrechnung [DataMember] public string Message { get; set; } + + [DataMember] + public GkvAbrechnungDC GkvAbrechnungDC { get; set; } } }