diff --git a/BeWo/ServiceProxy/Generated.cs b/BeWo/ServiceProxy/Generated.cs index 64252d825..a562fb832 100644 --- a/BeWo/ServiceProxy/Generated.cs +++ b/BeWo/ServiceProxy/Generated.cs @@ -2101,7 +2101,6 @@ namespace BeWo.ServiceProxy [System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.DataContracts.ServiceInvoicePeriodDC))] [System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.DataContracts.InvoiceNumberDC))] [System.ServiceModel.ServiceKnownTypeAttribute(typeof(System.Collections.Generic.List))] - [System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.DataContracts.AppResponseDC))] [System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.InvoiceType))] [System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.GkvTransferResultType))] [System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.DataContracts.GkvAbrechnung.GkvAbrechnungDC))] @@ -2116,6 +2115,7 @@ namespace BeWo.ServiceProxy [System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.DataContracts.GkvAbrechnung.GkvAbrechnungSendResponseDC))] [System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.DataContracts.GkvAbrechnung.GkvAbrechnungGetIKRequestDC))] [System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.DataContracts.GkvAbrechnung.GkvAbrechnungGetIKResponseDC))] + [System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.DataContracts.AppResponseDC))] [System.ServiceModel.ServiceKnownTypeAttribute(typeof(System.IO.MemoryStream))] [System.ServiceModel.ServiceKnownTypeAttribute(typeof(System.IO.Stream))] [System.ServiceModel.ServiceKnownTypeAttribute(typeof(System.Collections.Generic.List))] @@ -6379,7 +6379,6 @@ namespace BeWo.ServiceProxy [System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.DataContracts.ServiceInvoicePeriodDC))] [System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.DataContracts.InvoiceNumberDC))] [System.ServiceModel.ServiceKnownTypeAttribute(typeof(System.Collections.Generic.List))] - [System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.DataContracts.AppResponseDC))] [System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.InvoiceType))] [System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.GkvTransferResultType))] [System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.DataContracts.GkvAbrechnung.GkvAbrechnungDC))] @@ -6394,6 +6393,7 @@ namespace BeWo.ServiceProxy [System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.DataContracts.GkvAbrechnung.GkvAbrechnungSendResponseDC))] [System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.DataContracts.GkvAbrechnung.GkvAbrechnungGetIKRequestDC))] [System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.DataContracts.GkvAbrechnung.GkvAbrechnungGetIKResponseDC))] + [System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.DataContracts.AppResponseDC))] [System.ServiceModel.ServiceKnownTypeAttribute(typeof(System.IO.MemoryStream))] [System.ServiceModel.ServiceKnownTypeAttribute(typeof(System.IO.Stream))] [System.ServiceModel.ServiceKnownTypeAttribute(typeof(System.Collections.Generic.List))] @@ -9751,38 +9751,6 @@ namespace BeWo.ServiceProxy [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IAccountingService/StorniereInvoiceBases", ReplyAction="http://tempuri.org/IAccountingService/StorniereInvoiceBasesResponse")] [System.ServiceModel.FaultContractAttribute(typeof(BeWo.ServiceProxy.BeWoFault), Action="http://tempuri.org/IAccountingService/StorniereInvoiceBasesBeWoFaultFault", Name="BeWoFault", Namespace="http://schemas.datacontract.org/2004/07/BeWo.Service.ServiceContracts")] void StorniereInvoiceBases(System.Collections.Generic.List invoices); - - [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IAccountingService/GetGkvAbrechnung", ReplyAction="http://tempuri.org/IAccountingService/GetGkvAbrechnungResponse")] - [System.ServiceModel.FaultContractAttribute(typeof(BeWo.ServiceProxy.BeWoFault), Action="http://tempuri.org/IAccountingService/GetGkvAbrechnungBeWoFaultFault", Name="BeWoFault", Namespace="http://schemas.datacontract.org/2004/07/BeWo.Service.ServiceContracts")] - BS.Shared.DataContracts.GkvAbrechnung.GkvAbrechnungDC GetGkvAbrechnung(long oid); - - [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IAccountingService/GetAllGkvAbrechnungen", ReplyAction="http://tempuri.org/IAccountingService/GetAllGkvAbrechnungenResponse")] - [System.ServiceModel.FaultContractAttribute(typeof(BeWo.ServiceProxy.BeWoFault), Action="http://tempuri.org/IAccountingService/GetAllGkvAbrechnungenBeWoFaultFault", Name="BeWoFault", Namespace="http://schemas.datacontract.org/2004/07/BeWo.Service.ServiceContracts")] - System.Collections.Generic.List GetAllGkvAbrechnungen(); - - [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IAccountingService/GetFilteredGkvAbrechnungen", ReplyAction="http://tempuri.org/IAccountingService/GetFilteredGkvAbrechnungenResponse")] - [System.ServiceModel.FaultContractAttribute(typeof(BeWo.ServiceProxy.BeWoFault), Action="http://tempuri.org/IAccountingService/GetFilteredGkvAbrechnungenBeWoFaultFault", Name="BeWoFault", Namespace="http://schemas.datacontract.org/2004/07/BeWo.Service.ServiceContracts")] - System.Collections.Generic.List GetFilteredGkvAbrechnungen(BS.Shared.DataContracts.GkvAbrechnung.GkvAbrechnungViewFilterDC gkvAbrechnungViewFilter); - - [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IAccountingService/CreateNewGkvAbrechnung", ReplyAction="http://tempuri.org/IAccountingService/CreateNewGkvAbrechnungResponse")] - [System.ServiceModel.FaultContractAttribute(typeof(BeWo.ServiceProxy.BeWoFault), Action="http://tempuri.org/IAccountingService/CreateNewGkvAbrechnungBeWoFaultFault", Name="BeWoFault", Namespace="http://schemas.datacontract.org/2004/07/BeWo.Service.ServiceContracts")] - BS.Shared.DataContracts.GkvAbrechnung.GkvAbrechnungCreateResponseDC CreateNewGkvAbrechnung(BS.Shared.DataContracts.GkvAbrechnung.GkvAbrechnungCreateRequestDC request); - - [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IAccountingService/UpdateGkvAbrechnung", ReplyAction="http://tempuri.org/IAccountingService/UpdateGkvAbrechnungResponse")] - [System.ServiceModel.FaultContractAttribute(typeof(BeWo.ServiceProxy.BeWoFault), Action="http://tempuri.org/IAccountingService/UpdateGkvAbrechnungBeWoFaultFault", Name="BeWoFault", Namespace="http://schemas.datacontract.org/2004/07/BeWo.Service.ServiceContracts")] - BS.Shared.DataContracts.GkvAbrechnung.GkvAbrechnungDC UpdateGkvAbrechnung(BS.Shared.DataContracts.GkvAbrechnung.GkvAbrechnungDC abrechnung); - - [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IAccountingService/DeleteGkvAbrechnung", ReplyAction="http://tempuri.org/IAccountingService/DeleteGkvAbrechnungResponse")] - [System.ServiceModel.FaultContractAttribute(typeof(BeWo.ServiceProxy.BeWoFault), Action="http://tempuri.org/IAccountingService/DeleteGkvAbrechnungBeWoFaultFault", Name="BeWoFault", Namespace="http://schemas.datacontract.org/2004/07/BeWo.Service.ServiceContracts")] - void DeleteGkvAbrechnung(BS.Shared.DataContracts.GkvAbrechnung.GkvAbrechnungDC abrechnung); - - [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IAccountingService/SendNewGkvAbrechnung", ReplyAction="http://tempuri.org/IAccountingService/SendNewGkvAbrechnungResponse")] - [System.ServiceModel.FaultContractAttribute(typeof(BeWo.ServiceProxy.BeWoFault), Action="http://tempuri.org/IAccountingService/SendNewGkvAbrechnungBeWoFaultFault", Name="BeWoFault", Namespace="http://schemas.datacontract.org/2004/07/BeWo.Service.ServiceContracts")] - BS.Shared.DataContracts.GkvAbrechnung.GkvAbrechnungSendResponseDC SendNewGkvAbrechnung(BS.Shared.DataContracts.GkvAbrechnung.GkvAbrechnungSendRequestDC req); - - [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IAccountingService/SendGetIKRequest", ReplyAction="http://tempuri.org/IAccountingService/SendGetIKRequestResponse")] - [System.ServiceModel.FaultContractAttribute(typeof(BeWo.ServiceProxy.BeWoFault), Action="http://tempuri.org/IAccountingService/SendGetIKRequestBeWoFaultFault", Name="BeWoFault", Namespace="http://schemas.datacontract.org/2004/07/BeWo.Service.ServiceContracts")] - BS.Shared.DataContracts.GkvAbrechnung.GkvAbrechnungGetIKResponseDC SendGetIKRequest(BS.Shared.DataContracts.GkvAbrechnung.GkvAbrechnungGetIKRequestDC req); } [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] @@ -9978,6 +9946,80 @@ namespace BeWo.ServiceProxy { base.Channel.StorniereInvoiceBases(invoices); } + } + + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] + [System.ServiceModel.ServiceContractAttribute(ConfigurationName="BeWo.ServiceProxy.IGkvAccountingService")] + public interface IGkvAccountingService + { + + [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IGkvAccountingService/GetGkvAbrechnung", ReplyAction="http://tempuri.org/IGkvAccountingService/GetGkvAbrechnungResponse")] + [System.ServiceModel.FaultContractAttribute(typeof(BeWo.ServiceProxy.BeWoFault), Action="http://tempuri.org/IGkvAccountingService/GetGkvAbrechnungBeWoFaultFault", Name="BeWoFault", Namespace="http://schemas.datacontract.org/2004/07/BeWo.Service.ServiceContracts")] + BS.Shared.DataContracts.GkvAbrechnung.GkvAbrechnungDC GetGkvAbrechnung(long oid); + + [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IGkvAccountingService/GetAllGkvAbrechnungen", ReplyAction="http://tempuri.org/IGkvAccountingService/GetAllGkvAbrechnungenResponse")] + [System.ServiceModel.FaultContractAttribute(typeof(BeWo.ServiceProxy.BeWoFault), Action="http://tempuri.org/IGkvAccountingService/GetAllGkvAbrechnungenBeWoFaultFault", Name="BeWoFault", Namespace="http://schemas.datacontract.org/2004/07/BeWo.Service.ServiceContracts")] + System.Collections.Generic.List GetAllGkvAbrechnungen(); + + [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IGkvAccountingService/GetFilteredGkvAbrechnungen", ReplyAction="http://tempuri.org/IGkvAccountingService/GetFilteredGkvAbrechnungenResponse")] + [System.ServiceModel.FaultContractAttribute(typeof(BeWo.ServiceProxy.BeWoFault), Action="http://tempuri.org/IGkvAccountingService/GetFilteredGkvAbrechnungenBeWoFaultFault" + + "", Name="BeWoFault", Namespace="http://schemas.datacontract.org/2004/07/BeWo.Service.ServiceContracts")] + System.Collections.Generic.List GetFilteredGkvAbrechnungen(BS.Shared.DataContracts.GkvAbrechnung.GkvAbrechnungViewFilterDC gkvAbrechnungViewFilter); + + [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IGkvAccountingService/CreateNewGkvAbrechnung", ReplyAction="http://tempuri.org/IGkvAccountingService/CreateNewGkvAbrechnungResponse")] + [System.ServiceModel.FaultContractAttribute(typeof(BeWo.ServiceProxy.BeWoFault), Action="http://tempuri.org/IGkvAccountingService/CreateNewGkvAbrechnungBeWoFaultFault", Name="BeWoFault", Namespace="http://schemas.datacontract.org/2004/07/BeWo.Service.ServiceContracts")] + BS.Shared.DataContracts.GkvAbrechnung.GkvAbrechnungCreateResponseDC CreateNewGkvAbrechnung(BS.Shared.DataContracts.GkvAbrechnung.GkvAbrechnungCreateRequestDC request); + + [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IGkvAccountingService/UpdateGkvAbrechnung", ReplyAction="http://tempuri.org/IGkvAccountingService/UpdateGkvAbrechnungResponse")] + [System.ServiceModel.FaultContractAttribute(typeof(BeWo.ServiceProxy.BeWoFault), Action="http://tempuri.org/IGkvAccountingService/UpdateGkvAbrechnungBeWoFaultFault", Name="BeWoFault", Namespace="http://schemas.datacontract.org/2004/07/BeWo.Service.ServiceContracts")] + BS.Shared.DataContracts.GkvAbrechnung.GkvAbrechnungDC UpdateGkvAbrechnung(BS.Shared.DataContracts.GkvAbrechnung.GkvAbrechnungDC abrechnung); + + [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IGkvAccountingService/DeleteGkvAbrechnung", ReplyAction="http://tempuri.org/IGkvAccountingService/DeleteGkvAbrechnungResponse")] + [System.ServiceModel.FaultContractAttribute(typeof(BeWo.ServiceProxy.BeWoFault), Action="http://tempuri.org/IGkvAccountingService/DeleteGkvAbrechnungBeWoFaultFault", Name="BeWoFault", Namespace="http://schemas.datacontract.org/2004/07/BeWo.Service.ServiceContracts")] + void DeleteGkvAbrechnung(BS.Shared.DataContracts.GkvAbrechnung.GkvAbrechnungDC abrechnung); + + [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IGkvAccountingService/SendNewGkvAbrechnung", ReplyAction="http://tempuri.org/IGkvAccountingService/SendNewGkvAbrechnungResponse")] + [System.ServiceModel.FaultContractAttribute(typeof(BeWo.ServiceProxy.BeWoFault), Action="http://tempuri.org/IGkvAccountingService/SendNewGkvAbrechnungBeWoFaultFault", Name="BeWoFault", Namespace="http://schemas.datacontract.org/2004/07/BeWo.Service.ServiceContracts")] + BS.Shared.DataContracts.GkvAbrechnung.GkvAbrechnungSendResponseDC SendNewGkvAbrechnung(BS.Shared.DataContracts.GkvAbrechnung.GkvAbrechnungSendRequestDC req); + + [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IGkvAccountingService/SendGetIKRequest", ReplyAction="http://tempuri.org/IGkvAccountingService/SendGetIKRequestResponse")] + [System.ServiceModel.FaultContractAttribute(typeof(BeWo.ServiceProxy.BeWoFault), Action="http://tempuri.org/IGkvAccountingService/SendGetIKRequestBeWoFaultFault", Name="BeWoFault", Namespace="http://schemas.datacontract.org/2004/07/BeWo.Service.ServiceContracts")] + BS.Shared.DataContracts.GkvAbrechnung.GkvAbrechnungGetIKResponseDC SendGetIKRequest(BS.Shared.DataContracts.GkvAbrechnung.GkvAbrechnungGetIKRequestDC req); + } + + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] + public interface IGkvAccountingServiceChannel : BeWo.ServiceProxy.IGkvAccountingService, System.ServiceModel.IClientChannel + { + } + + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] + public partial class GkvAccountingServiceClient : System.ServiceModel.ClientBase, BeWo.ServiceProxy.IGkvAccountingService + { + + public GkvAccountingServiceClient() + { + } + + public GkvAccountingServiceClient(string endpointConfigurationName) : + base(endpointConfigurationName) + { + } + + public GkvAccountingServiceClient(string endpointConfigurationName, string remoteAddress) : + base(endpointConfigurationName, remoteAddress) + { + } + + public GkvAccountingServiceClient(string endpointConfigurationName, System.ServiceModel.EndpointAddress remoteAddress) : + base(endpointConfigurationName, remoteAddress) + { + } + + public GkvAccountingServiceClient(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress) : + base(binding, remoteAddress) + { + } public BS.Shared.DataContracts.GkvAbrechnung.GkvAbrechnungDC GetGkvAbrechnung(long oid) { diff --git a/BeWo/ServiceProxy/ServiceFacade.cs b/BeWo/ServiceProxy/ServiceFacade.cs index 60f6ae8e1..36b895a99 100644 --- a/BeWo/ServiceProxy/ServiceFacade.cs +++ b/BeWo/ServiceProxy/ServiceFacade.cs @@ -59,6 +59,7 @@ namespace BeWo.ServiceProxy { typeof(IAnalysisService), new EndpointAddress(_ServerName + "AnalysisService.svc") }, { typeof(IMailService), new EndpointAddress(_ServerName + "MailService.svc") }, { typeof(IAccountingService), new EndpointAddress(_ServerName + "AccountingService.svc") }, + { typeof(IGkvAccountingService), new EndpointAddress(_ServerName + "GkvAccountingService.svc") }, { typeof(IReportService), new EndpointAddress(_ServerName + "ReportService.svc") } }; @@ -232,21 +233,19 @@ namespace BeWo.ServiceProxy return default(T); } - public static void DoWohnheimServiceAsync(Func pFunc, Action pCallBack, bool showWaitDialog) + #region Wohnheim + public static void DoWohnheimServiceAsync(Func pFunc, Action pCallBack, bool showWaitDialog) { DoAsync(pFunc, pCallBack, showWaitDialog); } - public static void DoWohnheimServiceAsync(Func pFunc, Action pCallBack) { DoAsync(pFunc, pCallBack, true); } - public static void DoWohnheimServiceAsync(Action pAction) { DoAsync(pAction, true); } - public static void DoWohnheimServiceSync(Action pAction) { try @@ -258,12 +257,11 @@ namespace BeWo.ServiceProxy ShowErrorMessage(e); } } - - public static T DoWohnheimServiceSync(Func pFunc) + public static T DoWohnheimServiceSync(Func pFunc) { try { - return pFunc.Invoke(GetInstance()); + return pFunc.Invoke(GetInstance()); } catch (Exception e) { @@ -272,8 +270,49 @@ namespace BeWo.ServiceProxy return default(T); } + #endregion - public static void DoMailServiceAsync(Func pFunc, Action pCallBack) + #region GkvAccounting + public static void DoGkvAccountingServiceAsync(Func pFunc, Action pCallBack, bool showWaitDialog) + { + DoAsync(pFunc, pCallBack, showWaitDialog); + } + public static void DoGkvAccountingServiceAsync(Func pFunc, Action pCallBack) + { + DoAsync(pFunc, pCallBack, true); + } + public static void DoGkvAccountingServiceAsync(Action pAction) + { + DoAsync(pAction, true); + } + public static void DoGkvAccountingServiceSync(Action pAction) + { + try + { + pAction.Invoke(GetInstance()); + } + catch (Exception e) + { + ShowErrorMessage(e); + } + } + public static T DoGkvAccountingServiceSync(Func pFunc) + { + try + { + return pFunc.Invoke(GetInstance()); + } + catch (Exception e) + { + ShowErrorMessage(e); + } + + return default(T); + } + #endregion + + + public static void DoMailServiceAsync(Func pFunc, Action pCallBack) { DoAsync(pFunc, pCallBack, true); } diff --git a/BeWo/ServiceReferences.bat b/BeWo/ServiceReferences.bat index a16d0daee..961a31321 100644 --- a/BeWo/ServiceReferences.bat +++ b/BeWo/ServiceReferences.bat @@ -1 +1 @@ -svcutil.exe /noConfig /edb /n:*,BeWo.ServiceProxy /out:ServiceProxy\Generated.cs /ct:System.Collections.Generic.List`1 /r:..\Shared\bin\Debug\BS.Shared.dll http://localhost:3777/Host/EmployeeService.svc?wsdl http://localhost:3777/Host/CustomerService.svc?wsdl http://localhost:3777/Host/UserService.svc?wsdl http://localhost:3777/Host/StreamingService.svc?wsdl http://localhost:3777/Host/ValueListService.svc?wsdl http://localhost:3777/Host/DownloadService.svc?wsdl http://localhost:3777/Host/ResourceService.svc?wsdl http://localhost:3777/Host/OperationsService.svc?wsdl http://localhost:3777/Host/AnalysisService.svc?wsdl http://localhost:3777/Host/MailService.svc?wsdl http://localhost:3777/Host/AccountingService.svc?wsdl http://localhost:3777/Host/ReportService.svc?wsdl http://localhost:3777/Host/QueryService.svc?wsdl +svcutil.exe /noConfig /edb /n:*,BeWo.ServiceProxy /out:ServiceProxy\Generated.cs /ct:System.Collections.Generic.List`1 /r:..\Shared\bin\Debug\BS.Shared.dll http://localhost:3777/Host/EmployeeService.svc?wsdl http://localhost:3777/Host/CustomerService.svc?wsdl http://localhost:3777/Host/UserService.svc?wsdl http://localhost:3777/Host/StreamingService.svc?wsdl http://localhost:3777/Host/ValueListService.svc?wsdl http://localhost:3777/Host/DownloadService.svc?wsdl http://localhost:3777/Host/ResourceService.svc?wsdl http://localhost:3777/Host/OperationsService.svc?wsdl http://localhost:3777/Host/AnalysisService.svc?wsdl http://localhost:3777/Host/MailService.svc?wsdl http://localhost:3777/Host/AccountingService.svc?wsdl http://localhost:3777/Host/GkvAccountingService.svc?wsdl http://localhost:3777/Host/ReportService.svc?wsdl http://localhost:3777/Host/QueryService.svc?wsdl diff --git a/BeWo/View/Detail/Accounting/GkvAbrechnungOverview.xaml.cs b/BeWo/View/Detail/Accounting/GkvAbrechnungOverview.xaml.cs index 75bd05354..7b4bb6f0b 100644 --- a/BeWo/View/Detail/Accounting/GkvAbrechnungOverview.xaml.cs +++ b/BeWo/View/Detail/Accounting/GkvAbrechnungOverview.xaml.cs @@ -73,7 +73,7 @@ namespace BeWo.View.Detail.Accounting { _IsRequesting = true; - ServiceFacade.DoAccountingServiceAsync(s => s.GetFilteredGkvAbrechnungen(null), UpdateGkvAbrechnungList); + ServiceFacade.DoGkvAccountingServiceAsync(s => s.GetFilteredGkvAbrechnungen(null), UpdateGkvAbrechnungList); } catch(Exception e) { @@ -185,7 +185,7 @@ namespace BeWo.View.Detail.Accounting SelectedInvoiceBases = checked_invoice_bases.Select(x => x.DataContract.InvoiceBaseOid.Value).ToList() }; - ServiceFacade.DoAccountingServiceAsync(x => x.CreateNewGkvAbrechnung(gkv_filter), + ServiceFacade.DoGkvAccountingServiceAsync(x => x.CreateNewGkvAbrechnung(gkv_filter), cb => Dispatcher.BeginInvoke(DispatcherPriority.Normal, (Action)delegate { @@ -235,7 +235,7 @@ namespace BeWo.View.Detail.Accounting { var dc_in = vm.CommitToDataContract(); - ServiceFacade.DoAccountingServiceAsync(x => x.UpdateGkvAbrechnung(dc_in), dc_out => + ServiceFacade.DoGkvAccountingServiceAsync(x => x.UpdateGkvAbrechnung(dc_in), dc_out => { Dispatcher.Invoke(() => { vm.UpdateByDataContract(dc_out); @@ -268,7 +268,7 @@ namespace BeWo.View.Detail.Accounting { _Viewmodel.VMList.Remove(vm); - ServiceFacade.DoAccountingServiceAsync(s => s.DeleteGkvAbrechnung(vm.CommitToDataContract())); + ServiceFacade.DoGkvAccountingServiceAsync(s => s.DeleteGkvAbrechnung(vm.CommitToDataContract())); } } private void NewButton_OnClick(object sender, RoutedEventArgs e) @@ -361,7 +361,7 @@ namespace BeWo.View.Detail.Accounting dc_in.Bezahlt = b; - ServiceFacade.DoAccountingServiceAsync(x => x.UpdateGkvAbrechnung(dc_in), dc_out => + ServiceFacade.DoGkvAccountingServiceAsync(x => x.UpdateGkvAbrechnung(dc_in), dc_out => { Dispatcher.Invoke(() => { vm.UpdateByDataContract(dc_out); @@ -375,7 +375,7 @@ namespace BeWo.View.Detail.Accounting dc_in.UrbelegeGesendet = b; - ServiceFacade.DoAccountingServiceAsync(x => x.UpdateGkvAbrechnung(dc_in), dc_out => + ServiceFacade.DoGkvAccountingServiceAsync(x => x.UpdateGkvAbrechnung(dc_in), dc_out => { Dispatcher.Invoke(() => { vm.UpdateByDataContract(dc_out); @@ -387,7 +387,7 @@ namespace BeWo.View.Detail.Accounting { var dc_in = vm.CommitToDataContract(); - ServiceFacade.DoAccountingServiceAsync(x => x.UpdateGkvAbrechnung(dc_in), dc_out => + ServiceFacade.DoGkvAccountingServiceAsync(x => x.UpdateGkvAbrechnung(dc_in), dc_out => { Dispatcher.Invoke(() => { vm.UpdateByDataContract(dc_out); diff --git a/BeWo/View/Detail/OrganisationView.xaml.cs b/BeWo/View/Detail/OrganisationView.xaml.cs index a649e5b05..0e157fa99 100644 --- a/BeWo/View/Detail/OrganisationView.xaml.cs +++ b/BeWo/View/Detail/OrganisationView.xaml.cs @@ -322,7 +322,7 @@ namespace BeWo.View.Detail req.IKKrankenkasse = ViewModel.IKKrankenkasse; req.Leistungserbringergruppe = ViewModel.Leistungserbringergruppe; - ServiceFacade.DoAccountingServiceAsync(x => x.SendGetIKRequest(req), cb => Dispatcher.Invoke(() => IKRequestCallback(req, cb))); + ServiceFacade.DoGkvAccountingServiceAsync(x => x.SendGetIKRequest(req), cb => Dispatcher.Invoke(() => IKRequestCallback(req, cb))); } private void IKRequestCallback(GkvAbrechnungGetIKRequestDC req, GkvAbrechnungGetIKResponseDC response) diff --git a/BeWo/ViewModel/GkvAbrechnungVM.cs b/BeWo/ViewModel/GkvAbrechnungVM.cs index 0c1f84c66..060a417d6 100644 --- a/BeWo/ViewModel/GkvAbrechnungVM.cs +++ b/BeWo/ViewModel/GkvAbrechnungVM.cs @@ -452,7 +452,7 @@ namespace BeWo.ViewModel req.GkvAbrechnungOid = GkvAbrechnungOid.Value; - ServiceFacade.DoAccountingServiceAsync(s => s.SendNewGkvAbrechnung(req), + ServiceFacade.DoGkvAccountingServiceAsync(s => s.SendNewGkvAbrechnung(req), cb => Application.Current.Dispatch(() => UpdateBySendResponse(cb)), true); } public void UpdateBySendResponse(GkvAbrechnungSendResponseDC cb) diff --git a/BeWo/app.config b/BeWo/app.config index 4c3bb1ff3..df92ffbac 100644 --- a/BeWo/app.config +++ b/BeWo/app.config @@ -43,6 +43,7 @@ + diff --git a/Host/GkvAbrechnungClient.aspx.cs b/Host/GkvAbrechnungClient.aspx.cs index c6493e368..107601de9 100644 --- a/Host/GkvAbrechnungClient.aspx.cs +++ b/Host/GkvAbrechnungClient.aspx.cs @@ -8,6 +8,7 @@ using BS.Shared.DataContracts; using BS.Shared.DataContracts.GkvAbrechnung; using BS.Shared.Exceptions; using Newtonsoft.Json; +using NHibernate.Dialect.Function; using System; using System.Collections.Generic; using System.Configuration; @@ -93,7 +94,7 @@ namespace Host try { - var service = new AccountingServiceImp(); + var service = new GkvAccountingServiceImp(); service.HandleGkvServerResults(req.ResultDCs); diff --git a/Host/GkvAccountingService.svc b/Host/GkvAccountingService.svc new file mode 100644 index 000000000..36e689755 --- /dev/null +++ b/Host/GkvAccountingService.svc @@ -0,0 +1 @@ +<%@ ServiceHost Language="C#" Debug="true" Service="BeWo.Service.ServiceImplementations.GkvAccountingServiceImp" %> \ No newline at end of file diff --git a/Host/Host.csproj b/Host/Host.csproj index 5e278ece5..2256ad3ef 100644 --- a/Host/Host.csproj +++ b/Host/Host.csproj @@ -168,6 +168,7 @@ + diff --git a/Host/Web.config b/Host/Web.config index d69ef62c6..2a6bfdf6f 100644 --- a/Host/Web.config +++ b/Host/Web.config @@ -169,6 +169,9 @@ + + + diff --git a/Service/Service.csproj b/Service/Service.csproj index 8da0c85a9..24582056b 100644 --- a/Service/Service.csproj +++ b/Service/Service.csproj @@ -482,6 +482,7 @@ + @@ -493,6 +494,7 @@ + diff --git a/Service/ServiceContracts/IAccountingService.cs b/Service/ServiceContracts/IAccountingService.cs index 90f31269e..cfde99dbf 100644 --- a/Service/ServiceContracts/IAccountingService.cs +++ b/Service/ServiceContracts/IAccountingService.cs @@ -140,37 +140,5 @@ namespace BeWo.Service.ServiceContracts [FaultContract(typeof(BeWoFault))] [OperationContract] void StorniereInvoiceBases(List invoices); - - [FaultContract(typeof(BeWoFault))] - [OperationContract] - GkvAbrechnungDC GetGkvAbrechnung(long oid); - - [FaultContract(typeof(BeWoFault))] - [OperationContract] - List GetAllGkvAbrechnungen(); - - [FaultContract(typeof(BeWoFault))] - [OperationContract] - List GetFilteredGkvAbrechnungen(GkvAbrechnungViewFilterDC gkvAbrechnungViewFilter); - - [FaultContract(typeof(BeWoFault))] - [OperationContract] - GkvAbrechnungCreateResponseDC CreateNewGkvAbrechnung(GkvAbrechnungCreateRequestDC request); - - [FaultContract(typeof(BeWoFault))] - [OperationContract] - GkvAbrechnungDC UpdateGkvAbrechnung(GkvAbrechnungDC abrechnung); - - [FaultContract(typeof(BeWoFault))] - [OperationContract] - void DeleteGkvAbrechnung(GkvAbrechnungDC abrechnung); - - [FaultContract(typeof(BeWoFault))] - [OperationContract] - GkvAbrechnungSendResponseDC SendNewGkvAbrechnung(GkvAbrechnungSendRequestDC req); - - [FaultContract(typeof(BeWoFault))] - [OperationContract] - GkvAbrechnungGetIKResponseDC SendGetIKRequest(GkvAbrechnungGetIKRequestDC req); } } \ No newline at end of file diff --git a/Service/ServiceContracts/IGkvAccountingService.cs b/Service/ServiceContracts/IGkvAccountingService.cs new file mode 100644 index 000000000..35e905f28 --- /dev/null +++ b/Service/ServiceContracts/IGkvAccountingService.cs @@ -0,0 +1,46 @@ +using BS.Shared.DataContracts.GkvAbrechnung; +using System; +using System.Collections.Generic; +using System.Linq; +using System.ServiceModel; +using System.Text; +using System.Threading.Tasks; + +namespace BeWo.Service.ServiceContracts +{ + [ServiceContract] + public interface IGkvAccountingService + { + [FaultContract(typeof(BeWoFault))] + [OperationContract] + GkvAbrechnungDC GetGkvAbrechnung(long oid); + + [FaultContract(typeof(BeWoFault))] + [OperationContract] + List GetAllGkvAbrechnungen(); + + [FaultContract(typeof(BeWoFault))] + [OperationContract] + List GetFilteredGkvAbrechnungen(GkvAbrechnungViewFilterDC gkvAbrechnungViewFilter); + + [FaultContract(typeof(BeWoFault))] + [OperationContract] + GkvAbrechnungCreateResponseDC CreateNewGkvAbrechnung(GkvAbrechnungCreateRequestDC request); + + [FaultContract(typeof(BeWoFault))] + [OperationContract] + GkvAbrechnungDC UpdateGkvAbrechnung(GkvAbrechnungDC abrechnung); + + [FaultContract(typeof(BeWoFault))] + [OperationContract] + void DeleteGkvAbrechnung(GkvAbrechnungDC abrechnung); + + [FaultContract(typeof(BeWoFault))] + [OperationContract] + GkvAbrechnungSendResponseDC SendNewGkvAbrechnung(GkvAbrechnungSendRequestDC req); + + [FaultContract(typeof(BeWoFault))] + [OperationContract] + GkvAbrechnungGetIKResponseDC SendGetIKRequest(GkvAbrechnungGetIKRequestDC req); + } +} diff --git a/Service/ServiceImplementations/AccountingServiceImp.cs b/Service/ServiceImplementations/AccountingServiceImp.cs index dcb25cc5e..ebe9ce08b 100644 --- a/Service/ServiceImplementations/AccountingServiceImp.cs +++ b/Service/ServiceImplementations/AccountingServiceImp.cs @@ -745,600 +745,5 @@ namespace BeWo.Service.ServiceImplementations throw Utils.CreateBeWoFaultException(e); } } - - #region GKV - public GkvAbrechnungDC GetGkvAbrechnung(long oid) - { - try - { - var gkv = DAOFactory.GenericDAO.GetByID(oid); - - var dc = MapperFactory.GkvAbrechnungDC_GkvAbrechnung.MapToNewDC(gkv); - - return dc; - } - catch (Exception e) - { - throw Utils.CreateBeWoFaultException(e); - } - } - public List GetFilteredGkvAbrechnungen(GkvAbrechnungViewFilterDC gkvAbrechnungViewFilter) - { - try - { - if (gkvAbrechnungViewFilter == null || !gkvAbrechnungViewFilter.FilterTime) - return GetAllGkvAbrechnungen(); - - var start = gkvAbrechnungViewFilter.Start; - var end = gkvAbrechnungViewFilter.End; - var filter = gkvAbrechnungViewFilter.FilterForInvoiceDate; - - return GetGkvAbrechnungen(() => DAOFactory.SearchDAO.GetGkvAbrechnungen(start, end, filter)); - } - catch (Exception e) - { - throw Utils.CreateBeWoFaultException(e); - } - } - public List GetAllGkvAbrechnungen() - { - try - { - return GetGkvAbrechnungen(() => DAOFactory.GenericDAO.GetAllActive()); - } - catch (Exception e) - { - throw Utils.CreateBeWoFaultException(e); - } - } - private List GetGkvAbrechnungen(Func> get_entities) - { - var entities = get_entities(); - - var dcs = MapperFactory.GkvAbrechnungDC_GkvAbrechnung.MapToNewDCs(entities); - - var updateables = dcs.Where(x => x.IsWaiting()).ToArray(); - - if (!updateables.Any()) - return dcs; - - var isUpToDate = SendApp8GetStatusRequest(updateables); - - if (isUpToDate) - return dcs; - - entities = get_entities(); - - dcs = MapperFactory.GkvAbrechnungDC_GkvAbrechnung.MapToNewDCs(entities); - - return dcs; - } - - public GkvAbrechnungCreateResponseDC CreateNewGkvAbrechnung(GkvAbrechnungCreateRequestDC request) - { - var response = new GkvAbrechnungCreateResponseDC(); - - try - { - var invoice_bases = DAOFactory.GenericDAO.LoadByIDs(request.SelectedInvoiceBases); - - ValidatorExtended.ValidateGkvAbrechnung(request.GkvAbrechnungDC, invoice_bases); - - var gkv_abrechnung = MapperFactory.GkvAbrechnungDC_GkvAbrechnung.MapToNewEntity(request.GkvAbrechnungDC); - - if (gkv_abrechnung.AbrechnungsZeitraumEnde.Value.Hour == 0) - { - gkv_abrechnung.AbrechnungsZeitraumEnde = gkv_abrechnung.AbrechnungsZeitraumEnde.Value.Date.AddDays(1).AddMilliseconds(-1); - } - - var orga = gkv_abrechnung.Organisation; - - gkv_abrechnung.Verfahrensstufe = orga.Verfahrensstufe; - - decimal gesamt = 0; - foreach (var invoicebase_oid in request.SelectedInvoiceBases) - { - var service = DAOFactory.SearchDAO.GetServiceInvoiceByInvoiceBaseOid(invoicebase_oid); - - foreach (var peroid in service.ServiceInvoicePeriodList) - { - foreach (var invoice in peroid.InvoiceItemList) - { - gesamt += invoice.AmountTotal.Value; - } - } - } - - gkv_abrechnung.Betrag = gesamt; - gkv_abrechnung.Bezahlt = false; - - gkv_abrechnung.ErstelltAm = DateTime.Now; - - DAOFactory.GenericDAO.Insert(gkv_abrechnung); - - var gkv_abrechnung_dc = MapperFactory.GkvAbrechnungDC_GkvAbrechnung.MapToNewDC(gkv_abrechnung); - - response.Success = true; - response.GkvAbrechnungDC = gkv_abrechnung_dc; - } - catch (GkvException exc) - { - MailUtils.SendGkvModuleErrorMail("CreateNewGkvAbrechnung", exc, Tenant); - - if (exc.Title.IsNotNullOrWhiteSpace()) - response.TitleMessage = exc.Title; - response.Message = exc.Message; - } - catch (Exception e) - { - MailUtils.SendGkvModuleErrorMail("CreateNewGkvAbrechnung", e, Tenant); - - throw Utils.CreateBeWoFaultException(e); - } - - return response; - } - public GkvAbrechnungDC UpdateGkvAbrechnung(GkvAbrechnungDC abrechnung) - { - try - { - var entity = DAOFactory.GenericDAO.GetByID(abrechnung.GkvAbrechnungOid.Value); - - MapperFactory.GkvAbrechnungDC_GkvAbrechnung.MergeWithEntity(abrechnung, entity); - - foreach (var invoice in entity.InvoiceBases) - { - invoice.IsPaid = entity.Bezahlt; - } - - DAOFactory.GenericDAO.Update(entity); - - return MapperFactory.GkvAbrechnungDC_GkvAbrechnung.MapToNewDC(entity); - } - catch (Exception e) - { - throw Utils.CreateBeWoFaultException(e); - } - } - public void DeleteGkvAbrechnung(GkvAbrechnungDC abrechnung) - { - try - { - ServiceLogic.SetActivationType(abrechnung.GkvAbrechnungOid.Value, abrechnung.GkvAbrechnungVersion.Value, ActivationTypeId.Deleted); - } - catch (Exception e) - { - throw Utils.CreateBeWoFaultException(e); - } - } - - public GkvAbrechnungSendResponseDC SendNewGkvAbrechnung(GkvAbrechnungSendRequestDC req) - { - var response = new GkvAbrechnungSendResponseDC(); - - var oid = req.GkvAbrechnungOid; - - var entity = DAOFactory.GenericDAO.LoadByID(oid); - - var state = entity.GetState(); - - if (entity.IsWaiting() || state == GkvState.Paid) - { - response.Message = "Validierung fehlgeschlagen"; - return response; - } - - var protokoll = CreateGkvTransferProtokoll(entity, out var error); - if (error is object) - { - MailUtils.SendGkvModuleErrorMail("SendNewGkvAbrechnung - CreateGkvTransferProtokoll", error, Tenant); - - response.TitleMessage = "Protokoll Erstellung"; - response.Message = error; - return response; - } - - if (entity.GkvTransferProtokolle is null) - entity.GkvTransferProtokolle = new List(); - - entity.GkvTransferProtokolle.Add(protokoll); - - // Protokoll braucht Oid - DAOFactory.GenericDAO.Update(entity); - - try - { - var app8_response = SendApp8SendNewRequest(protokoll); - - var app8_protokoll = app8_response.GkvTransferProtokollDC; - - MapperFactory.GkvTransferProtokollDC_GkvTransferprotokoll.MergeWithEntity(app8_protokoll, protokoll); - - response.Success = app8_response.Success; - response.Message = app8_response.Message; - } - catch (GkvException de) - { - protokoll.ResultType = GkvTransferResultType.FailSoft; - protokoll.Fehlerdatum = DateTime.Now; - protokoll.Fehlernachricht = de.Message; - protokoll.Fehlertitel = de.Title ?? "Default"; - } - catch (Exception e) - { - protokoll.ResultType = GkvTransferResultType.FailFatal; - protokoll.Fehlerdatum = DateTime.Now; - protokoll.Fehlernachricht = e.ToString(); - protokoll.Fehlertitel = "Erstellung (kritisch)"; - } - - DAOFactory.GenericDAO.Update(entity); - - response.TransferProtokoll = MapperFactory.GkvTransferProtokollDC_GkvTransferprotokoll.MapToNewDC(protokoll); - response.GkvAbrechnungDC = MapperFactory.GkvAbrechnungDC_GkvAbrechnung.MapToNewDC(entity); - - return response; - } - public GkvAbrechnungGetIKResponseDC SendGetIKRequest(GkvAbrechnungGetIKRequestDC req) - { - try - { - var app8req = new GkvServerGetIKRequestDC - { - IKKrankenkasse = req.IKKrankenkasse, - Leistungserbringergruppe = req.Leistungserbringergruppe, - Abrechnungscode = DakotaUtils.GetAbrechnungscode(req.Leistungserbringergruppe), - Tarifkennzeichen = DakotaUtils.GetTarifkennzeichen(req.Leistungserbringergruppe) - }; - - var app8res = SendApp8Request(app8req); - - // Erstelle Response - var res = new GkvAbrechnungGetIKResponseDC - { - BezDatenannahmestelle = app8res.BezDatenannahmestelle, - Gefunden = app8res.Gefunden, - IKDatenannahmestelle = app8res.IKDatenannahmestelle, - IKKostentrager = app8res.IKKostentrager, - IKKrankenkasse = app8res.IKKrankenkasse, - Message = app8res.Message, - Success = app8res.Success - }; - - // Schaue, ob IK Krankenkassen bereits bei einer anderen Organisation hinterlegt ist - if (res.Gefunden) - { - // Holt alle Organisationen - var orgas = DAOFactory.SearchDAO.GetAllOrganisationByIKKrankenkasse(req.IKKrankenkasse); - - // Entfernt sich selber - if (req.OrganisationOid is long oid) - { - orgas.RemoveAll(x => x.Oid == oid); - } - - if (orgas.Any()) - { - res.BereitsEnthalten = true; - res.BereitsEnthaltenBei = orgas.Select(x => x.Name).ToList(); - } - } - - return res; - } - catch (Exception e) - { - throw Utils.CreateBeWoFaultException(e); - } - } - - private GkvTransferProtokoll CreateGkvTransferProtokoll(GkvAbrechnung gkvAbrechnung, out string error) - { - var protokoll = new GkvTransferProtokoll - { - ErstelltAm = DateTime.Now, - GkvAbrechnungOid = gkvAbrechnung.Oid.Value - }; - - error = null; - - try - { - ValidatorExtended.ValidateGkvAbrechnung(gkvAbrechnung, gkvAbrechnung.InvoiceBases); - - var manager = new DakotaManager(); - var mandatordc = new OperationsServiceImp().GetMandator(); - - Validator.ValidateMandator(mandatordc); - - var gkvAbrechnungDC = MapperFactory.GkvAbrechnungDC_GkvAbrechnung.MapToNewDC(gkvAbrechnung); - var orgadc = gkvAbrechnungDC.Organisation; - - Validator.ValidateOrganisation(orgadc); - - var datenannahmestelle = orgadc.IKDatenannahmestelle; - var (datenaustauschreferenz, transfernummer) = GetNextDatenaustauschreferenzTransfernummer(gkvAbrechnung, datenannahmestelle); - var (dat_short, tra_short) = ClearDatenaustauschreferenzTransfernummer(datenaustauschreferenz, transfernummer); - - var first_cost = gkvAbrechnung.InvoiceBases.First().CostBearer2SupportConcept.SupportConcept.Customer; - - var plugin = PluginLoader.FindClass(); - var addressInfo = plugin.GetAddressInformation(first_cost.Oid); - - foreach (var invoicebase in gkvAbrechnung.InvoiceBases) - { - var customer = invoicebase.CostBearer2SupportConcept.SupportConcept.Customer; - - var addressInfo2 = plugin.GetAddressInformation(customer.Oid); - - if (addressInfo.IKLeistungserbringer != addressInfo2.IKLeistungserbringer) - { - throw new GkvException($"Klient '{first_cost.Person.LastNameFirstName}' ({addressInfo.IKLeistungserbringer}) und '{customer.Person.LastNameFirstName}' ({addressInfo2.IKLeistungserbringer}) verweisen auf unterschiedliche Leistungserbringer."); - } - } - - foreach (var invoicebase in gkvAbrechnung.InvoiceBases) - { - var service = DAOFactory.SearchDAO.GetServiceInvoiceByInvoiceBaseOid(invoicebase.Oid.Value); - var orga2 = invoicebase.CostBearer2SupportConcept.CostBearer.Organisation; - var customer = invoicebase.CostBearer2SupportConcept.SupportConcept.Customer; - - var invoicebase_dc = MapperFactory.InvoiceBaseDC_InvoiceBase.MapToNewDC(invoicebase); - - var servicedc = MapperFactory.ServiceInvoiceDC_ServiceInvoice.MapToNewDC(service); - var customerdc = MapperFactory.CustomerDC_Customer.MapToNewDC(customer); - - Validator.ValidateCustomer(customerdc); - - manager.Add(servicedc, orgadc, customerdc, addressInfo, dat_short, tra_short); - } - - manager.Apply(); - - if (manager.DakotaFileDict.Count != 1 || manager.DakotaFileDict.First().Value.GetKostenträgerCount() != 1) - { - var msg = "Unerwartete Anzahl an Dakota Files berechnet."; - - throw new GkvException(msg); - } - - var file_from_manager = manager.DakotaFileDict.First().Value; - - var nutzdatendatei = file_from_manager.GetNutzdatendatei(); - - // https://dev.mysql.com/doc/refman/8.3/en/string-type-syntax.html - // A TEXT column with a maximum length of 16,777,215 (224 − 1) characters. - // The effective maximum length is less if the value contains multibyte characters. - // Each MEDIUMTEXT value is stored using a 3-byte length prefix that indicates the number of bytes in the value. - // - // Type | Maximum length - // -----------+------------------------------------- - // TINYTEXT | 255(2^8−1) bytes - // TEXT | 65,535(2^16−1) bytes = 64 KiB - // MEDIUMTEXT | 16,777,215(2^24−1) bytes = 16 MiB - // LONGTEXT | 4,294,967,295(2^32−1) bytes = 4 GiB - if (nutzdatendatei.Length > 16777215) - { - var msg = $"nutzdatendatei - Länger als 16777215: {nutzdatendatei.Length}"; - - throw new GkvException(msg); - } - - protokoll.Datenaustauschreferenz = datenaustauschreferenz; - protokoll.Transfernummer = transfernummer; - - protokoll.IKDatenannahmestelle = file_from_manager.GetIKDatenannahmestelle(); - protokoll.IKKostentrager = file_from_manager.GetIKKostenträger(); - protokoll.IKLeistungserbringer = file_from_manager.GetIKLeistungserbringer(); - protokoll.IKKrankenkasse = file_from_manager.GetIKVersichertenKarte(); - - protokoll.Rechnungsnummer = file_from_manager.GetRechnungsnummer(); - protokoll.Auftragsdatei = file_from_manager.GetAuftragsdatei(); - protokoll.Nutzdatendatei = nutzdatendatei; - protokoll.Transfername = file_from_manager.GetTransferName(); - protokoll.Dateigrosse = nutzdatendatei.Length; - - protokoll.Dateityp = "Nutzdatendatei"; - protokoll.Dateiname = protokoll.Transfername; - - protokoll.AbsenderBezeichnung = "ownSoft GmbH"; - protokoll.EmpfangerBezeichnung = orgadc.BezDatenannahmestelle; - - return protokoll; - } - catch (GkvException de) - { - error = de.ToString(); - } - catch (Exception e) - { - error = e.ToString(); - } - - return null; - } - - private Tuple GetNextDatenaustauschreferenzTransfernummer(GkvAbrechnung gkvAbrechnung, string datenannahmestelle) - { - var datenaustauschref = DAOFactory.SearchDAO.GetNextDatenaustauschreferenz(datenannahmestelle); - int transfernummer; - - var state = gkvAbrechnung.GetState(); - - if (state == GkvState.NoSend) - { - transfernummer = DAOFactory.SearchDAO.GetNextTransfernummer(datenannahmestelle); - } - else if (state == GkvState.ErrorSoft || state == GkvState.ErrorFatal || state == GkvState.ErrorFolgefehler) - { - transfernummer = gkvAbrechnung.GkvTransferProtokolle.Last().Transfernummer; - } - else - { - throw new ArgumentException($"Versucht Transfernummer zu laden, invalid state: {state}", nameof(state)); - } - - return new Tuple(datenaustauschref, transfernummer); - } - private Tuple ClearDatenaustauschreferenzTransfernummer(int datenaustauschreferenz, int transfernummer) - { - int d = datenaustauschreferenz % 99999; - int t = transfernummer % 1000; - - if (d == 0) - { - d = 99999; - } - - return new Tuple(d, t); - } - - private GkvServerSendNewResponseDC SendApp8SendNewRequest(GkvTransferProtokoll protokoll) - { - var gkv_transfer_dc = MapperFactory.GkvTransferProtokollDC_GkvTransferprotokoll.MapToNewDC(protokoll); - - var request_app8 = new GkvServerSendNewRequestDC - { - Protokoll = gkv_transfer_dc - }; - - var response_app8 = SendApp8Request(request_app8); - - if (!response_app8.Success) - throw new GkvException(response_app8.Message); - - return response_app8; - } - /// - /// - /// - /// - /// - /// - /// Returns true, if the states are all up to date. False otherwise. - private bool SendApp8GetStatusRequest(GkvAbrechnungDC[] updateables) - { - var updateables_len = updateables.Count(); - - var request = new GkvServerGetStatusRequestDC - { - Tenant = MultitenancyOperationContextExt.Current.Tenant, - Oids = new long[updateables_len] - }; - - for (int id = 0; id < updateables_len; id++) - { - var gkv_abrechnung = updateables[id]; - var gkv_transfer = gkv_abrechnung.TransferProtokolle.Last(); - - request.Oids[id] = gkv_transfer.GkvTransferProtokollOid.Value; - } - - GkvServerGetStatusResponseDC response_app8; - try - { - response_app8 = SendApp8Request(request); - } - catch (Exception e) - { - MailUtils.SendGkvModuleErrorMail("GkvServerGetStatusRequest Error", e, Tenant); - - return true; - } - - if (!response_app8.Success) - throw new GkvException("Success false - " + response_app8.Message); - - if (response_app8.Results is null) - throw new GkvException("Result null - " + response_app8.Message); - - var results = response_app8.Results.Where(x => x is object); - - if (!results.Any()) - return true; - - HandleGkvServerResults(results); - - return false; - } - - public void HandleGkvServerResults(IEnumerable results) - { - var protokolls = new List(); - foreach (var result in results) - { - var protokoll = DAOFactory.GenericDAO.GetByID(result.ProtokollOid); - - protokoll.ResultType = result.ResultType; - protokoll.Fehlertitel = result.Titel; - protokoll.Fehlerdatum = result.Datum; - protokoll.Fehlernachricht = result.Nachricht; - - switch (result.ResultType) - { - case GkvTransferResultType.Success: - protokoll.SentDakotaSuccess = true; - break; - case GkvTransferResultType.FailSoft: - protokoll.SentApp8Success = false; - break; - case GkvTransferResultType.FailFatal: - protokoll.SentApp8Success = false; - break; - case GkvTransferResultType.FailFollowUp: - protokoll.SentApp8Success = false; - break; - } - - protokolls.Add(protokoll); - } - - if (protokolls.Any()) - DAOFactory.GenericDAO.Update(protokolls); - - var follows = results.Where(x => x.ResultType == GkvTransferResultType.FailFollowUp); - - if (follows.Any()) - { - foreach (var follow in follows) - { - var protokoll_oid = follow.ProtokollOid; - var protokoll = DAOFactory.GenericDAO.LoadByID(protokoll_oid); - var abrechnung_oid = protokoll.GkvAbrechnungOid; - - var new_req = new GkvAbrechnungSendRequestDC() - { - GkvAbrechnungOid = abrechnung_oid - }; - - var res = SendNewGkvAbrechnung(new_req); - - if (!res.Success) - throw new GkvException("Success - " + res.Message); - } - } - } - - private Res SendApp8Request(Req request) where Req : GkvServerRequestDC where Res : GkvResponseDC - { - var user = LoggedInUserOperationContextExt.Current?.User ?? SessionFacade.LoggedInUser; - if (user == null) - { - throw new GkvException("User unbekannt", "KundenApp"); - } - - request.Username = user.LoginName; - request.Password = user.BCryptPassword; - request.Tenant = MultitenancyOperationContextExt.Current.Tenant; - - if (request is GkvServerSendNewRequestDC send_new_req) - { - send_new_req.ApplicationUserOid = user.Oid.Value; - } - - return GkvSender.SendApp8Request(request, request.Tenant); - } - - #endregion } } \ No newline at end of file diff --git a/Service/ServiceImplementations/GkvAccountingServiceImp.cs b/Service/ServiceImplementations/GkvAccountingServiceImp.cs new file mode 100644 index 000000000..27d96130f --- /dev/null +++ b/Service/ServiceImplementations/GkvAccountingServiceImp.cs @@ -0,0 +1,624 @@ +using BeWo.Data; +using BeWo.Data.Access; +using BeWo.Data.Entities; +using BeWo.Service.Core; +using BeWo.Service.DCEntityMapper; +using BeWo.Service.Plugins; +using BeWo.Service.ServiceContracts; +using BS.Shared; +using BS.Shared.AppSender; +using BS.Shared.Core; +using BS.Shared.DataContracts.GkvAbrechnung; +using BS.Shared.Exceptions; +using BS.Shared.Extensions; +using Dakota; +using Dakota.Logic; +using System; +using System.Collections.Generic; +using System.Linq; +using System.ServiceModel; +using System.Text; +using System.Threading.Tasks; + +using Utils = BeWo.Service.Core.Utils; + +namespace BeWo.Service.ServiceImplementations +{ + [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall, ConcurrencyMode = ConcurrencyMode.Single)] + public class GkvAccountingServiceImp : IGkvAccountingService + { + public string Tenant => MultitenancyOperationContextExt.Current?.Tenant; + + public GkvAbrechnungDC GetGkvAbrechnung(long oid) + { + try + { + var gkv = DAOFactory.GenericDAO.GetByID(oid); + + var dc = MapperFactory.GkvAbrechnungDC_GkvAbrechnung.MapToNewDC(gkv); + + return dc; + } + catch (Exception e) + { + throw Utils.CreateBeWoFaultException(e); + } + } + public List GetFilteredGkvAbrechnungen(GkvAbrechnungViewFilterDC gkvAbrechnungViewFilter) + { + try + { + if (gkvAbrechnungViewFilter == null || !gkvAbrechnungViewFilter.FilterTime) + return GetAllGkvAbrechnungen(); + + var start = gkvAbrechnungViewFilter.Start; + var end = gkvAbrechnungViewFilter.End; + var filter = gkvAbrechnungViewFilter.FilterForInvoiceDate; + + return GetGkvAbrechnungen(() => DAOFactory.SearchDAO.GetGkvAbrechnungen(start, end, filter)); + } + catch (Exception e) + { + throw Utils.CreateBeWoFaultException(e); + } + } + public List GetAllGkvAbrechnungen() + { + try + { + return GetGkvAbrechnungen(() => DAOFactory.GenericDAO.GetAllActive()); + } + catch (Exception e) + { + throw Utils.CreateBeWoFaultException(e); + } + } + private List GetGkvAbrechnungen(Func> get_entities) + { + var entities = get_entities(); + + var dcs = MapperFactory.GkvAbrechnungDC_GkvAbrechnung.MapToNewDCs(entities); + + var updateables = dcs.Where(x => x.IsWaiting()).ToArray(); + + if (!updateables.Any()) + return dcs; + + var isUpToDate = SendApp8GetStatusRequest(updateables); + + if (isUpToDate) + return dcs; + + entities = get_entities(); + + dcs = MapperFactory.GkvAbrechnungDC_GkvAbrechnung.MapToNewDCs(entities); + + return dcs; + } + + public GkvAbrechnungCreateResponseDC CreateNewGkvAbrechnung(GkvAbrechnungCreateRequestDC request) + { + var response = new GkvAbrechnungCreateResponseDC(); + + try + { + var invoice_bases = DAOFactory.GenericDAO.LoadByIDs(request.SelectedInvoiceBases); + + ValidatorExtended.ValidateGkvAbrechnung(request.GkvAbrechnungDC, invoice_bases); + + var gkv_abrechnung = MapperFactory.GkvAbrechnungDC_GkvAbrechnung.MapToNewEntity(request.GkvAbrechnungDC); + + if (gkv_abrechnung.AbrechnungsZeitraumEnde.Value.Hour == 0) + { + gkv_abrechnung.AbrechnungsZeitraumEnde = gkv_abrechnung.AbrechnungsZeitraumEnde.Value.Date.AddDays(1).AddMilliseconds(-1); + } + + var orga = gkv_abrechnung.Organisation; + + gkv_abrechnung.Verfahrensstufe = orga.Verfahrensstufe; + + decimal gesamt = 0; + foreach (var invoicebase_oid in request.SelectedInvoiceBases) + { + var service = DAOFactory.SearchDAO.GetServiceInvoiceByInvoiceBaseOid(invoicebase_oid); + + foreach (var peroid in service.ServiceInvoicePeriodList) + { + foreach (var invoice in peroid.InvoiceItemList) + { + gesamt += invoice.AmountTotal.Value; + } + } + } + + gkv_abrechnung.Betrag = gesamt; + gkv_abrechnung.Bezahlt = false; + + gkv_abrechnung.ErstelltAm = DateTime.Now; + + DAOFactory.GenericDAO.Insert(gkv_abrechnung); + + var gkv_abrechnung_dc = MapperFactory.GkvAbrechnungDC_GkvAbrechnung.MapToNewDC(gkv_abrechnung); + + response.Success = true; + response.GkvAbrechnungDC = gkv_abrechnung_dc; + } + catch (GkvException exc) + { + MailUtils.SendGkvModuleErrorMail("CreateNewGkvAbrechnung", exc, Tenant); + + if (exc.Title.IsNotNullOrWhiteSpace()) + response.TitleMessage = exc.Title; + response.Message = exc.Message; + } + catch (Exception e) + { + MailUtils.SendGkvModuleErrorMail("CreateNewGkvAbrechnung", e, Tenant); + + throw Utils.CreateBeWoFaultException(e); + } + + return response; + } + public GkvAbrechnungDC UpdateGkvAbrechnung(GkvAbrechnungDC abrechnung) + { + try + { + var entity = DAOFactory.GenericDAO.GetByID(abrechnung.GkvAbrechnungOid.Value); + + MapperFactory.GkvAbrechnungDC_GkvAbrechnung.MergeWithEntity(abrechnung, entity); + + foreach (var invoice in entity.InvoiceBases) + { + invoice.IsPaid = entity.Bezahlt; + } + + DAOFactory.GenericDAO.Update(entity); + + return MapperFactory.GkvAbrechnungDC_GkvAbrechnung.MapToNewDC(entity); + } + catch (Exception e) + { + throw Utils.CreateBeWoFaultException(e); + } + } + public void DeleteGkvAbrechnung(GkvAbrechnungDC abrechnung) + { + try + { + ServiceLogic.SetActivationType(abrechnung.GkvAbrechnungOid.Value, abrechnung.GkvAbrechnungVersion.Value, ActivationTypeId.Deleted); + } + catch (Exception e) + { + throw Utils.CreateBeWoFaultException(e); + } + } + + public GkvAbrechnungSendResponseDC SendNewGkvAbrechnung(GkvAbrechnungSendRequestDC req) + { + var response = new GkvAbrechnungSendResponseDC(); + + var oid = req.GkvAbrechnungOid; + + var entity = DAOFactory.GenericDAO.LoadByID(oid); + + var state = entity.GetState(); + + if (entity.IsWaiting() || state == GkvState.Paid) + { + response.Message = "Validierung fehlgeschlagen"; + return response; + } + + var protokoll = CreateGkvTransferProtokoll(entity, out var error); + if (error is object) + { + MailUtils.SendGkvModuleErrorMail("SendNewGkvAbrechnung - CreateGkvTransferProtokoll", error, Tenant); + + response.TitleMessage = "Protokoll Erstellung"; + response.Message = error; + return response; + } + + if (entity.GkvTransferProtokolle is null) + entity.GkvTransferProtokolle = new List(); + + entity.GkvTransferProtokolle.Add(protokoll); + + // Protokoll braucht Oid + DAOFactory.GenericDAO.Update(entity); + + try + { + var app8_response = SendApp8SendNewRequest(protokoll); + + var app8_protokoll = app8_response.GkvTransferProtokollDC; + + MapperFactory.GkvTransferProtokollDC_GkvTransferprotokoll.MergeWithEntity(app8_protokoll, protokoll); + + response.Success = app8_response.Success; + response.Message = app8_response.Message; + } + catch (GkvException de) + { + protokoll.ResultType = GkvTransferResultType.FailSoft; + protokoll.Fehlerdatum = DateTime.Now; + protokoll.Fehlernachricht = de.Message; + protokoll.Fehlertitel = de.Title ?? "Default"; + } + catch (Exception e) + { + protokoll.ResultType = GkvTransferResultType.FailFatal; + protokoll.Fehlerdatum = DateTime.Now; + protokoll.Fehlernachricht = e.ToString(); + protokoll.Fehlertitel = "Erstellung (kritisch)"; + } + + DAOFactory.GenericDAO.Update(entity); + + response.TransferProtokoll = MapperFactory.GkvTransferProtokollDC_GkvTransferprotokoll.MapToNewDC(protokoll); + response.GkvAbrechnungDC = MapperFactory.GkvAbrechnungDC_GkvAbrechnung.MapToNewDC(entity); + + return response; + } + public GkvAbrechnungGetIKResponseDC SendGetIKRequest(GkvAbrechnungGetIKRequestDC req) + { + try + { + var app8req = new GkvServerGetIKRequestDC + { + IKKrankenkasse = req.IKKrankenkasse, + Leistungserbringergruppe = req.Leistungserbringergruppe, + Abrechnungscode = DakotaUtils.GetAbrechnungscode(req.Leistungserbringergruppe), + Tarifkennzeichen = DakotaUtils.GetTarifkennzeichen(req.Leistungserbringergruppe) + }; + + var app8res = SendApp8Request(app8req); + + // Erstelle Response + var res = new GkvAbrechnungGetIKResponseDC + { + BezDatenannahmestelle = app8res.BezDatenannahmestelle, + Gefunden = app8res.Gefunden, + IKDatenannahmestelle = app8res.IKDatenannahmestelle, + IKKostentrager = app8res.IKKostentrager, + IKKrankenkasse = app8res.IKKrankenkasse, + Message = app8res.Message, + Success = app8res.Success + }; + + // Schaue, ob IK Krankenkassen bereits bei einer anderen Organisation hinterlegt ist + if (res.Gefunden) + { + // Holt alle Organisationen + var orgas = DAOFactory.SearchDAO.GetAllOrganisationByIKKrankenkasse(req.IKKrankenkasse); + + // Entfernt sich selber + if (req.OrganisationOid is long oid) + { + orgas.RemoveAll(x => x.Oid == oid); + } + + if (orgas.Any()) + { + res.BereitsEnthalten = true; + res.BereitsEnthaltenBei = orgas.Select(x => x.Name).ToList(); + } + } + + return res; + } + catch (Exception e) + { + throw Utils.CreateBeWoFaultException(e); + } + } + + private GkvTransferProtokoll CreateGkvTransferProtokoll(GkvAbrechnung gkvAbrechnung, out string error) + { + var protokoll = new GkvTransferProtokoll + { + ErstelltAm = DateTime.Now, + GkvAbrechnungOid = gkvAbrechnung.Oid.Value + }; + + error = null; + + try + { + ValidatorExtended.ValidateGkvAbrechnung(gkvAbrechnung, gkvAbrechnung.InvoiceBases); + + var manager = new DakotaManager(); + var mandatordc = new OperationsServiceImp().GetMandator(); + + Validator.ValidateMandator(mandatordc); + + var gkvAbrechnungDC = MapperFactory.GkvAbrechnungDC_GkvAbrechnung.MapToNewDC(gkvAbrechnung); + var orgadc = gkvAbrechnungDC.Organisation; + + Validator.ValidateOrganisation(orgadc); + + var datenannahmestelle = orgadc.IKDatenannahmestelle; + var (datenaustauschreferenz, transfernummer) = GetNextDatenaustauschreferenzTransfernummer(gkvAbrechnung, datenannahmestelle); + var (dat_short, tra_short) = ClearDatenaustauschreferenzTransfernummer(datenaustauschreferenz, transfernummer); + + var first_cost = gkvAbrechnung.InvoiceBases.First().CostBearer2SupportConcept.SupportConcept.Customer; + + var plugin = PluginLoader.FindClass(); + var addressInfo = plugin.GetAddressInformation(first_cost.Oid); + + foreach (var invoicebase in gkvAbrechnung.InvoiceBases) + { + var customer = invoicebase.CostBearer2SupportConcept.SupportConcept.Customer; + + var addressInfo2 = plugin.GetAddressInformation(customer.Oid); + + if (addressInfo.IKLeistungserbringer != addressInfo2.IKLeistungserbringer) + { + throw new GkvException($"Klient '{first_cost.Person.LastNameFirstName}' ({addressInfo.IKLeistungserbringer}) und '{customer.Person.LastNameFirstName}' ({addressInfo2.IKLeistungserbringer}) verweisen auf unterschiedliche Leistungserbringer."); + } + } + + foreach (var invoicebase in gkvAbrechnung.InvoiceBases) + { + var service = DAOFactory.SearchDAO.GetServiceInvoiceByInvoiceBaseOid(invoicebase.Oid.Value); + var orga2 = invoicebase.CostBearer2SupportConcept.CostBearer.Organisation; + var customer = invoicebase.CostBearer2SupportConcept.SupportConcept.Customer; + + var invoicebase_dc = MapperFactory.InvoiceBaseDC_InvoiceBase.MapToNewDC(invoicebase); + + var servicedc = MapperFactory.ServiceInvoiceDC_ServiceInvoice.MapToNewDC(service); + var customerdc = MapperFactory.CustomerDC_Customer.MapToNewDC(customer); + + Validator.ValidateCustomer(customerdc); + + manager.Add(servicedc, orgadc, customerdc, addressInfo, dat_short, tra_short); + } + + manager.Apply(); + + if (manager.DakotaFileDict.Count != 1 || manager.DakotaFileDict.First().Value.GetKostenträgerCount() != 1) + { + var msg = "Unerwartete Anzahl an Dakota Files berechnet."; + + throw new GkvException(msg); + } + + var file_from_manager = manager.DakotaFileDict.First().Value; + + var nutzdatendatei = file_from_manager.GetNutzdatendatei(); + + // https://dev.mysql.com/doc/refman/8.3/en/string-type-syntax.html + // A TEXT column with a maximum length of 16,777,215 (224 − 1) characters. + // The effective maximum length is less if the value contains multibyte characters. + // Each MEDIUMTEXT value is stored using a 3-byte length prefix that indicates the number of bytes in the value. + // + // Type | Maximum length + // -----------+------------------------------------- + // TINYTEXT | 255(2^8−1) bytes + // TEXT | 65,535(2^16−1) bytes = 64 KiB + // MEDIUMTEXT | 16,777,215(2^24−1) bytes = 16 MiB + // LONGTEXT | 4,294,967,295(2^32−1) bytes = 4 GiB + if (nutzdatendatei.Length > 16777215) + { + var msg = $"nutzdatendatei - Länger als 16777215: {nutzdatendatei.Length}"; + + throw new GkvException(msg); + } + + protokoll.Datenaustauschreferenz = datenaustauschreferenz; + protokoll.Transfernummer = transfernummer; + + protokoll.IKDatenannahmestelle = file_from_manager.GetIKDatenannahmestelle(); + protokoll.IKKostentrager = file_from_manager.GetIKKostenträger(); + protokoll.IKLeistungserbringer = file_from_manager.GetIKLeistungserbringer(); + protokoll.IKKrankenkasse = file_from_manager.GetIKVersichertenKarte(); + + protokoll.Rechnungsnummer = file_from_manager.GetRechnungsnummer(); + protokoll.Auftragsdatei = file_from_manager.GetAuftragsdatei(); + protokoll.Nutzdatendatei = nutzdatendatei; + protokoll.Transfername = file_from_manager.GetTransferName(); + protokoll.Dateigrosse = nutzdatendatei.Length; + + protokoll.Dateityp = "Nutzdatendatei"; + protokoll.Dateiname = protokoll.Transfername; + + protokoll.AbsenderBezeichnung = "ownSoft GmbH"; + protokoll.EmpfangerBezeichnung = orgadc.BezDatenannahmestelle; + + return protokoll; + } + catch (GkvException de) + { + error = de.ToString(); + } + catch (Exception e) + { + error = e.ToString(); + } + + return null; + } + + private Tuple GetNextDatenaustauschreferenzTransfernummer(GkvAbrechnung gkvAbrechnung, string datenannahmestelle) + { + var datenaustauschref = DAOFactory.SearchDAO.GetNextDatenaustauschreferenz(datenannahmestelle); + int transfernummer; + + var state = gkvAbrechnung.GetState(); + + if (state == GkvState.NoSend) + { + transfernummer = DAOFactory.SearchDAO.GetNextTransfernummer(datenannahmestelle); + } + else if (state == GkvState.ErrorSoft || state == GkvState.ErrorFatal || state == GkvState.ErrorFolgefehler) + { + transfernummer = gkvAbrechnung.GkvTransferProtokolle.Last().Transfernummer; + } + else + { + throw new ArgumentException($"Versucht Transfernummer zu laden, invalid state: {state}", nameof(state)); + } + + return new Tuple(datenaustauschref, transfernummer); + } + private Tuple ClearDatenaustauschreferenzTransfernummer(int datenaustauschreferenz, int transfernummer) + { + int d = datenaustauschreferenz % 99999; + int t = transfernummer % 1000; + + if (d == 0) + { + d = 99999; + } + + return new Tuple(d, t); + } + + private GkvServerSendNewResponseDC SendApp8SendNewRequest(GkvTransferProtokoll protokoll) + { + var gkv_transfer_dc = MapperFactory.GkvTransferProtokollDC_GkvTransferprotokoll.MapToNewDC(protokoll); + + var request_app8 = new GkvServerSendNewRequestDC + { + Protokoll = gkv_transfer_dc + }; + + var response_app8 = SendApp8Request(request_app8); + + if (!response_app8.Success) + throw new GkvException(response_app8.Message); + + return response_app8; + } + /// + /// + /// + /// + /// + /// + /// Returns true, if the states are all up to date. False otherwise. + private bool SendApp8GetStatusRequest(GkvAbrechnungDC[] updateables) + { + var updateables_len = updateables.Count(); + + var request = new GkvServerGetStatusRequestDC + { + Tenant = MultitenancyOperationContextExt.Current.Tenant, + Oids = new long[updateables_len] + }; + + for (int id = 0; id < updateables_len; id++) + { + var gkv_abrechnung = updateables[id]; + var gkv_transfer = gkv_abrechnung.TransferProtokolle.Last(); + + request.Oids[id] = gkv_transfer.GkvTransferProtokollOid.Value; + } + + GkvServerGetStatusResponseDC response_app8; + try + { + response_app8 = SendApp8Request(request); + } + catch (Exception e) + { + MailUtils.SendGkvModuleErrorMail("GkvServerGetStatusRequest Error", e, Tenant); + + return true; + } + + if (!response_app8.Success) + throw new GkvException("Success false - " + response_app8.Message); + + if (response_app8.Results is null) + throw new GkvException("Result null - " + response_app8.Message); + + var results = response_app8.Results.Where(x => x is object); + + if (!results.Any()) + return true; + + HandleGkvServerResults(results); + + return false; + } + + public void HandleGkvServerResults(IEnumerable results) + { + var protokolls = new List(); + foreach (var result in results) + { + var protokoll = DAOFactory.GenericDAO.GetByID(result.ProtokollOid); + + protokoll.ResultType = result.ResultType; + protokoll.Fehlertitel = result.Titel; + protokoll.Fehlerdatum = result.Datum; + protokoll.Fehlernachricht = result.Nachricht; + + switch (result.ResultType) + { + case GkvTransferResultType.Success: + protokoll.SentDakotaSuccess = true; + break; + case GkvTransferResultType.FailSoft: + protokoll.SentApp8Success = false; + break; + case GkvTransferResultType.FailFatal: + protokoll.SentApp8Success = false; + break; + case GkvTransferResultType.FailFollowUp: + protokoll.SentApp8Success = false; + break; + } + + protokolls.Add(protokoll); + } + + if (protokolls.Any()) + DAOFactory.GenericDAO.Update(protokolls); + + var follows = results.Where(x => x.ResultType == GkvTransferResultType.FailFollowUp); + + if (follows.Any()) + { + foreach (var follow in follows) + { + var protokoll_oid = follow.ProtokollOid; + var protokoll = DAOFactory.GenericDAO.LoadByID(protokoll_oid); + var abrechnung_oid = protokoll.GkvAbrechnungOid; + + var new_req = new GkvAbrechnungSendRequestDC() + { + GkvAbrechnungOid = abrechnung_oid + }; + + var res = SendNewGkvAbrechnung(new_req); + + if (!res.Success) + throw new GkvException("Success - " + res.Message); + } + } + } + + private Res SendApp8Request(Req request) where Req : GkvServerRequestDC where Res : GkvResponseDC + { + var user = LoggedInUserOperationContextExt.Current?.User ?? SessionFacade.LoggedInUser; + if (user == null) + { + throw new GkvException("User unbekannt", "KundenApp"); + } + + request.Username = user.LoginName; + request.Password = user.BCryptPassword; + request.Tenant = MultitenancyOperationContextExt.Current.Tenant; + + if (request is GkvServerSendNewRequestDC send_new_req) + { + send_new_req.ApplicationUserOid = user.Oid.Value; + } + + return GkvSender.SendApp8Request(request, request.Tenant); + } + } +}