From d6eaa0cdbe4436cfcbe8156e45e8902888d6ccad Mon Sep 17 00:00:00 2001 From: Rene Evertz Date: Thu, 17 Oct 2024 13:57:06 +0200 Subject: [PATCH 01/46] =?UTF-8?q?IK=20Nummern=20=C3=BCber=20Organisation?= =?UTF-8?q?=20direkt=20abholbar=20->=20Felder=20ausgeblendet,=20wenn=20kei?= =?UTF-8?q?ne=20Recht=20->=20Erprobung=20neuer=20Default=20->=20Debug=20ka?= =?UTF-8?q?nn=20auch=20Test=20einstellen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BeWo/ServiceProxy/Generated.cs | 21 + BeWo/Styles/ControlStyles/ButtonStyles.xaml | 14 + BeWo/View/Detail/OrganisationView.xaml | 1032 ++++---- BeWo/View/Detail/OrganisationView.xaml.cs | 37 +- BeWo/ViewModel/OrganisationVM.cs | 63 +- Dakota/Dakota.csproj | 3 +- Dakota/DakotaUtils.cs | 146 + Dakota/DakotaValidator.cs | 106 - Dakota/Logic/DakotaUtils.cs | 84 - Dakota/Models/Daten/Datenelement.cs | 2 +- Host/GkvAbrechnungView.aspx.cs | 575 ++-- Host/Login.aspx.cs | 3 + ...ganisation Erprobungsverfahren Default.txt | 2 + .../ServiceContracts/IAccountingService.cs | 4 + .../AccountingServiceImp.cs | 2338 +++++++++-------- Shared/Core/DakotaValidator.cs | 53 + .../GkvAbrechnung/GkvApp8GetIKRequest.cs | 3 + Shared/Shared.csproj | 1 + 18 files changed, 2325 insertions(+), 2162 deletions(-) create mode 100644 Dakota/DakotaUtils.cs delete mode 100644 Dakota/DakotaValidator.cs delete mode 100644 Dakota/Logic/DakotaUtils.cs create mode 100644 Model/Changes_2024_10_16 Organisation Erprobungsverfahren Default.txt create mode 100644 Shared/Core/DakotaValidator.cs diff --git a/BeWo/ServiceProxy/Generated.cs b/BeWo/ServiceProxy/Generated.cs index 5fa8cef80..4a78387c9 100644 --- a/BeWo/ServiceProxy/Generated.cs +++ b/BeWo/ServiceProxy/Generated.cs @@ -1755,6 +1755,7 @@ namespace BeWo.ServiceProxy [System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.Priority))] [System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.Status))] [System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.QBFilterEnum))] + [System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.GkvVerfahrensstufe))] [System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.DataContracts.Compact.CompactWohnheimDC))] [System.ServiceModel.ServiceKnownTypeAttribute(typeof(System.Collections.Generic.List))] [System.ServiceModel.ServiceKnownTypeAttribute(typeof(System.Collections.Generic.List))] @@ -2093,6 +2094,7 @@ namespace BeWo.ServiceProxy [System.ServiceModel.ServiceKnownTypeAttribute(typeof(System.Collections.Generic.List))] [System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.InvoiceType))] [System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.GkvTransferFehlerlevel))] + [System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.GkvAbrechnungApp8RequestTypeDC))] [System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.DataContracts.GkvAbrechnung.GkvAbrechnungDC))] [System.ServiceModel.ServiceKnownTypeAttribute(typeof(System.Collections.Generic.List))] [System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.DataContracts.GkvAbrechnung.GkvTransferProtokollDC))] @@ -2102,6 +2104,10 @@ namespace BeWo.ServiceProxy [System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.DataContracts.GkvAbrechnung.GkvAbrechnungResponseDC))] [System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.DataContracts.GkvAbrechnung.GkvAbrechnungSendRequestDC))] [System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.DataContracts.GkvAbrechnung.GkvAbrechnungSendResponseDC))] + [System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.DataContracts.GkvAbrechnung.GkvApp8GetIKRequest))] + [System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.DataContracts.GkvAbrechnung.GkvApp8Request))] + [System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.DataContracts.GkvAbrechnung.GkvApp8GetIKResponse))] + [System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.DataContracts.GkvAbrechnung.GkvApp8Response))] [System.ServiceModel.ServiceKnownTypeAttribute(typeof(System.IO.MemoryStream))] [System.ServiceModel.ServiceKnownTypeAttribute(typeof(System.IO.Stream))] [System.ServiceModel.ServiceKnownTypeAttribute(typeof(System.Collections.Generic.List))] @@ -5981,6 +5987,7 @@ namespace BeWo.ServiceProxy [System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.Priority))] [System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.Status))] [System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.QBFilterEnum))] + [System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.GkvVerfahrensstufe))] [System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.DataContracts.Compact.CompactWohnheimDC))] [System.ServiceModel.ServiceKnownTypeAttribute(typeof(System.Collections.Generic.List))] [System.ServiceModel.ServiceKnownTypeAttribute(typeof(System.Collections.Generic.List))] @@ -6319,6 +6326,7 @@ namespace BeWo.ServiceProxy [System.ServiceModel.ServiceKnownTypeAttribute(typeof(System.Collections.Generic.List))] [System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.InvoiceType))] [System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.GkvTransferFehlerlevel))] + [System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.GkvAbrechnungApp8RequestTypeDC))] [System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.DataContracts.GkvAbrechnung.GkvAbrechnungDC))] [System.ServiceModel.ServiceKnownTypeAttribute(typeof(System.Collections.Generic.List))] [System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.DataContracts.GkvAbrechnung.GkvTransferProtokollDC))] @@ -6328,6 +6336,10 @@ namespace BeWo.ServiceProxy [System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.DataContracts.GkvAbrechnung.GkvAbrechnungResponseDC))] [System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.DataContracts.GkvAbrechnung.GkvAbrechnungSendRequestDC))] [System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.DataContracts.GkvAbrechnung.GkvAbrechnungSendResponseDC))] + [System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.DataContracts.GkvAbrechnung.GkvApp8GetIKRequest))] + [System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.DataContracts.GkvAbrechnung.GkvApp8Request))] + [System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.DataContracts.GkvAbrechnung.GkvApp8GetIKResponse))] + [System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.DataContracts.GkvAbrechnung.GkvApp8Response))] [System.ServiceModel.ServiceKnownTypeAttribute(typeof(System.IO.MemoryStream))] [System.ServiceModel.ServiceKnownTypeAttribute(typeof(System.IO.Stream))] [System.ServiceModel.ServiceKnownTypeAttribute(typeof(System.Collections.Generic.List))] @@ -9705,6 +9717,10 @@ namespace BeWo.ServiceProxy [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/SendApp8GetIKRequest", ReplyAction="http://tempuri.org/IAccountingService/SendApp8GetIKRequestResponse")] + [System.ServiceModel.FaultContractAttribute(typeof(BeWo.ServiceProxy.BeWoFault), Action="http://tempuri.org/IAccountingService/SendApp8GetIKRequestBeWoFaultFault", Name="BeWoFault", Namespace="http://schemas.datacontract.org/2004/07/BeWo.Service.ServiceContracts")] + BS.Shared.DataContracts.GkvAbrechnung.GkvApp8GetIKResponse SendApp8GetIKRequest(BS.Shared.DataContracts.GkvAbrechnung.GkvApp8GetIKRequest req); } [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] @@ -9930,6 +9946,11 @@ namespace BeWo.ServiceProxy { return base.Channel.SendNewGkvAbrechnung(req); } + + public BS.Shared.DataContracts.GkvAbrechnung.GkvApp8GetIKResponse SendApp8GetIKRequest(BS.Shared.DataContracts.GkvAbrechnung.GkvApp8GetIKRequest req) + { + return base.Channel.SendApp8GetIKRequest(req); + } } [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] diff --git a/BeWo/Styles/ControlStyles/ButtonStyles.xaml b/BeWo/Styles/ControlStyles/ButtonStyles.xaml index 74e604440..5e01c9139 100644 --- a/BeWo/Styles/ControlStyles/ButtonStyles.xaml +++ b/BeWo/Styles/ControlStyles/ButtonStyles.xaml @@ -136,4 +136,18 @@ + + + + \ No newline at end of file diff --git a/BeWo/View/Detail/OrganisationView.xaml b/BeWo/View/Detail/OrganisationView.xaml index 7602a64dd..b9250e673 100644 --- a/BeWo/View/Detail/OrganisationView.xaml +++ b/BeWo/View/Detail/OrganisationView.xaml @@ -2,6 +2,7 @@ x:Class="BeWo.View.Detail.OrganisationView" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" + xmlns:core="clr-namespace:BS.Shared.Core;assembly=BS.Shared" xmlns:dxe="http://schemas.devexpress.com/winfx/2008/xaml/editors" xmlns:dxg="http://schemas.devexpress.com/winfx/2008/xaml/grid" xmlns:localView="clr-namespace:BeWo.View" @@ -9,7 +10,7 @@ xmlns:search="clr-namespace:BeWo.View.Search" xmlns:shared="clr-namespace:BS.Shared;assembly=BS.Shared" xmlns:uc="clr-namespace:BeWo.Controls;assembly=BeWo.Controls" - xmlns:val="clr-namespace:BeWo.Validation" xmlns:core="clr-namespace:BS.Shared.Core;assembly=BS.Shared" + xmlns:val="clr-namespace:BeWo.Validation" Width="Auto" Height="Auto" HorizontalAlignment="Stretch" @@ -164,514 +165,547 @@ Header="Details" IsSelected="True"> - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + - - + diff --git a/BeWo/View/Detail/OrganisationView.xaml.cs b/BeWo/View/Detail/OrganisationView.xaml.cs index 62b3fc8af..07eca4ed7 100644 --- a/BeWo/View/Detail/OrganisationView.xaml.cs +++ b/BeWo/View/Detail/OrganisationView.xaml.cs @@ -14,6 +14,7 @@ using BS.Shared; using BS.Shared.Core; using BS.Shared.DataContracts; using BS.Shared.DataContracts.Compact; +using BS.Shared.DataContracts.GkvAbrechnung; using BS.Shared.Extensions; using BS.Shared.Translation; using DevExpress.Xpf.Grid; @@ -59,6 +60,13 @@ namespace BeWo.View.Detail { tabitem_documents.Visibility = Visibility.Collapsed; } + +#if DEBUG + +#else + label_verfahrensstufe.Visibility = Visibility.Collapsed; + radiobuttons_verfahrensstufe.Visibility = Visibility.Collapsed; +#endif } public event EventHandler> OrganisationSavedOrUpdated; @@ -302,9 +310,32 @@ namespace BeWo.View.Detail ov.Margin = new Thickness(0, 10, 0, 0); Grid.SetRow(ov, 1); GridSBD.Children.Add(ov); - } } - - } + + private void IKNumber_Button_Click(object sender, RoutedEventArgs e) + { + var req = new GkvApp8GetIKRequest(); + + req.IKKrankenkasse = ViewModel.IKKrankenkasse; + req.Leistungserbringergruppe = ViewModel.Leistungserbringergruppe; + + ServiceFacade.DoAccountingServiceAsync(x => x.SendApp8GetIKRequest(req), cb => Dispatcher.Invoke(() => IKRequestCallback(req, cb))); + } + + private void IKRequestCallback(GkvApp8GetIKRequest req, GkvApp8GetIKResponse response) + { + if (!response.Gefunden) + { + MessageBox.Show($"Für die Organisation mit dem IK \"{req.IKKrankenkasse}\" und Leistungserbringergruppe \"{req.Leistungserbringergruppe}\" konnte keine Datenannahmestelle gefunden werden. " + + $"Bitte informieren Sie sich bei der Krankenkasse, ob zum elektronischen Datenaustausch " + + $"eine seperate Anmeldung benötigt wird."); + return; + } + + ViewModel.BezDatenannahmestelle = response.BezDatenannahmestelle; + ViewModel.IKKostentrager = response.IKKostentrager; + ViewModel.IKDatenannahmestelle = response.IKDatenannahmestelle; + } + } } \ No newline at end of file diff --git a/BeWo/ViewModel/OrganisationVM.cs b/BeWo/ViewModel/OrganisationVM.cs index c1b9e21e6..b0aa4508c 100644 --- a/BeWo/ViewModel/OrganisationVM.cs +++ b/BeWo/ViewModel/OrganisationVM.cs @@ -769,20 +769,25 @@ namespace BeWo.ViewModel } } + public bool IsIKNumberValid + => DakotaValidator.ValidateIKNumber(IKKrankenkasse) + && DakotaValidator.ValidateLeistungserbringergruppe(Leistungserbringergruppe); + public string IKKrankenkasse { get { return this._IKKrankenkasse; } set - { - if (this.AreDifferent(this._IKKrankenkasse, value)) - { - this._IKKrankenkasse = value; - this.StoreDirtyInformation(this.AreDifferent(this.DataContract.IKKrankenkasse, value), nameof(IKKrankenkasse)); - this.FirePropertyChanged(nameof(IKKrankenkasse)); - } - } - } + { + if (!AreDifferent(_IKKrankenkasse, value)) + return; + + _IKKrankenkasse = value; + StoreDirtyInformation(AreDifferent(DataContract.IKKrankenkasse, value), nameof(IKKrankenkasse)); + FirePropertyChanged(nameof(IKKrankenkasse)); + FirePropertyChanged(nameof(IsIKNumberValid)); + } + } public string IKKostentrager { @@ -831,18 +836,19 @@ namespace BeWo.ViewModel public string Leistungserbringergruppe { - get { return this._Leistungserbringergruppe; } + get { return _Leistungserbringergruppe; } set - { - if (this.AreDifferent(this._Leistungserbringergruppe, value)) - { - this._Leistungserbringergruppe = value; - this.StoreDirtyInformation(this.AreDifferent(this.DataContract.Leistungserbringergruppe, value), nameof(Leistungserbringergruppe)); - this.FirePropertyChanged(nameof(Leistungserbringergruppe)); - } - } - } + { + if (!AreDifferent(_Leistungserbringergruppe, value)) + return; + + _Leistungserbringergruppe = value; + StoreDirtyInformation(AreDifferent(DataContract.Leistungserbringergruppe, value), nameof(Leistungserbringergruppe)); + FirePropertyChanged(nameof(Leistungserbringergruppe)); + FirePropertyChanged(nameof(IsIKNumberValid)); + } + } public string BusinessPartnerId { @@ -870,6 +876,8 @@ namespace BeWo.ViewModel this._Verfahrensstufe = value; this.StoreDirtyInformation(this.AreDifferent(this.DataContract.Verfahrensstufe, value), nameof(Verfahrensstufe)); this.FirePropertyChanged(nameof(Verfahrensstufe)); + this.FirePropertyChanged(nameof(VerfahrensstufeInt)); + this.FirePropertyChanged(nameof(Echtverfahren)); } } } @@ -884,7 +892,22 @@ namespace BeWo.ViewModel return; Verfahrensstufe = (GkvVerfahrensstufe)value; - //FirePropertyChanged(nameof(VerfahrensstufeInt)); + } + } + + public bool Echtverfahren + { + get { return Verfahrensstufe == GkvVerfahrensstufe.Echt; } + + set + { + if (!AreDifferent(Echtverfahren, value)) + return; + + if (value) + Verfahrensstufe = GkvVerfahrensstufe.Echt; + else + Verfahrensstufe = GkvVerfahrensstufe.Erprobung; } } diff --git a/Dakota/Dakota.csproj b/Dakota/Dakota.csproj index 1f7e8398a..de47e4d3f 100644 --- a/Dakota/Dakota.csproj +++ b/Dakota/Dakota.csproj @@ -43,9 +43,9 @@ + - @@ -54,7 +54,6 @@ - diff --git a/Dakota/DakotaUtils.cs b/Dakota/DakotaUtils.cs new file mode 100644 index 000000000..c9a789b0d --- /dev/null +++ b/Dakota/DakotaUtils.cs @@ -0,0 +1,146 @@ +using BeWo.Data.Entities; +using BS.Shared.Core; +using BS.Shared.DataContracts; +using BS.Shared.DataContracts.GkvAbrechnung; +using Dakota.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Dakota +{ + public static class DakotaUtils + { + public static string FillFromLeft(string input, int length, char filler) + { + if (input.Length > length) + return input; + + if (input.Length == length) + return input; + + var sb = new StringBuilder(); + for (int i = 0; i < length - input.Length; i++) + { + sb.Append(filler); + } + sb.Append(input); + + return sb.ToString(); + } + + public static string FillFromRight(string input, int length, char filler) + { + if (input.Length > length) + return input; + + if (input.Length == length) + return input; + + var sb = new StringBuilder(); + sb.Append(input); + for (int i = 0; i < length - input.Length; i++) + { + sb.Append(filler); + } + + return sb.ToString(); + } + + public static string GetAbrechnungscode(string leistungserbringergruppe) + { + var len = leistungserbringergruppe.Length; + + if (len == 5) + { + return "69"; + } + else if (len == 7) + { + return leistungserbringergruppe.Substring(0, 2); + } + else + { + throw new ArgumentException($"Leistungserbringergruppe \"{leistungserbringergruppe}\" hat ungültige Anzahl Stellen"); + } + } + + public static string GetTarifkennzeichen(string leistungserbringergruppe) + { + var len = leistungserbringergruppe.Length; + + if (len == 5) + { + return leistungserbringergruppe; + } + else if (len == 7) + { + return leistungserbringergruppe.Substring(2); + // return leistungserbringergruppe.Substring(2, 5); + } + else + { + throw new ArgumentException($"Leistungserbringergruppe \"{leistungserbringergruppe}\" hat ungültige Anzahl Stellen"); + } + } + + public static string ClearTextString(string input) + { + foreach (var specialChar in DakotaConfig.SpecialCollection) + { + input = input.Replace(specialChar, DakotaConfig.Aufhebungszeichen + specialChar); + } + + return input.Trim(); + } + + /// + /// Validiert in erster Phase den Mandator. + /// + public static void ValidateMandator(MandatorDC mandatordc) + { + if (mandatordc == null) + throw new DakotaException("Mandator ist null"); + + if (!DakotaValidator.ValidateIKNumber(mandatordc.IKLeistungserbringer)) + throw new DakotaException($"Die IK Nummer des Leistungserbringers \"{mandatordc.IKLeistungserbringer}\" ist ungültig."); + } + + /// + /// Validiert in zweiter Phase die Daten. Bei Fehler wird eine DakotaException geworfen. + /// + public static void ValidateCustomer(CustomerDC customerDC) + { + string error = null; + + if (customerDC == null) + error = "Customer ist null"; + else if (!DakotaValidator.ValidateVersichertenstatus(customerDC.VersichertenStatus)) + error = $"Klient/in \"{customerDC.LastName}, {customerDC.FirstName}\" hat keinen gültigen Versichertenstatus"; + + if (error != null) + throw new DakotaException(error); + } + + public static void ValidateOrganisation(Organisation orga) + { + string error = null; + + if (orga == null) + error = "Organisation ist null"; + else if (!DakotaValidator.ValidateLeistungserbringergruppe(orga.Leistungserbringergruppe)) + error = $"Die Organisation \"{orga.Name}\" hat keine gültige Leistungserbringergruppe: \"{orga.Leistungserbringergruppe}\". Erwarten werden 5 Stellen für das Tarifkennzeichen alleine oder 7 Stellen für den Abrechnungscode und für das Tarifkennzeichen zusammen."; + else if (!DakotaValidator.ValidateIKNumber(orga.IKKrankenkasse)) + error = $"Die Organisation \"{orga.Name}\" hat kein gültiges IK Krankenkasse Kennzeichen: \"{orga.IKKrankenkasse}\"."; + else if (!DakotaValidator.ValidateIKNumber(orga.IKKostentrager)) + error = $"Die Organisation \"{orga.Name}\" hat kein gültiges IK Kostenträger Kennzeichen: \"{orga.IKKostentrager}\"."; + else if (!DakotaValidator.ValidateIKNumber(orga.IKDatenannahmestelle)) + error = $"Die Organisation \"{orga.Name}\" hat kein gültiges IK Datenannahmestelle Kennzeichen: \"{orga.IKDatenannahmestelle}\"."; + + if (error != null) + throw new DakotaException(error); + } + } +} diff --git a/Dakota/DakotaValidator.cs b/Dakota/DakotaValidator.cs deleted file mode 100644 index edf6b48e7..000000000 --- a/Dakota/DakotaValidator.cs +++ /dev/null @@ -1,106 +0,0 @@ -using BeWo.Data.Entities; -using BS.Shared.DataContracts; -using BS.Shared.DataContracts.GkvAbrechnung; -using Dakota.Models; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Dakota -{ - public static class DakotaValidator - { - public static string ClearTextString(string input) - { - foreach (var specialChar in DakotaConfig.SpecialCollection) - { - input = input.Replace(specialChar, DakotaConfig.Aufhebungszeichen + specialChar); - } - - return input.Trim(); - } - - /// - /// Validiert in erster Phase den Mandator. - /// - public static void ValidateMandator(MandatorDC mandatordc) - { - if (mandatordc == null) - throw new DakotaException("Mandator ist null"); - - if (!ValidateIKNumber(mandatordc.IKLeistungserbringer)) - throw new DakotaException($"Die IK Nummer des Leistungserbringers \"{mandatordc.IKLeistungserbringer}\" ist ungültig."); - } - - /// - /// Validiert in zweiter Phase die Daten. Bei Fehler wird eine DakotaException geworfen. - /// - public static void ValidateCustomer(CustomerDC customerDC) - { - string error = null; - - if (customerDC == null) - error = "Customer ist null"; - else if (!ValidateVersichertenstatus(customerDC.VersichertenStatus)) - error = $"Klient/in \"{customerDC.LastName}, {customerDC.FirstName}\" hat keinen gültigen Versichertenstatus"; - - if (error != null) - throw new DakotaException(error); - } - - public static void ValidateOrganisation(Organisation orga) - { - string error = null; - - if (orga == null) - error = "Organisation ist null"; - else if (!ValidateLeistungserbringergruppe(orga.Leistungserbringergruppe)) - error = $"Die Organisation \"{orga.Name}\" hat keine gültige Leistungserbringergruppe: \"{orga.Leistungserbringergruppe}\". Erwarten werden 5 Stellen für das Tarifkennzeichen alleine oder 7 Stellen für den Abrechnungscode und für das Tarifkennzeichen zusammen."; - else if (!ValidateIKNumber(orga.IKKrankenkasse)) - error = $"Die Organisation \"{orga.Name}\" hat kein gültiges IK Kennzeichen: \"{orga.IKKrankenkasse}\"."; - - if (error != null) - throw new DakotaException(error); - } - - public static bool ValidateOrganisationInformations(Organisation orga) - => ValidateIKNumbers(orga.IKDatenannahmestelle, orga.IKKostentrager, orga.IKKrankenkasse) && !string.IsNullOrEmpty(orga.BezDatenannahmestelle); - private static bool ValidateIKNumbers(params string[] iks) - => iks?.All(ValidateIKNumber) ?? false; - - private static bool ValidateIKNumber(string iknummer) - { - if (iknummer == null) - return false; - - if (iknummer.Length != 9) - return false; - - return int.TryParse(iknummer, out int x); - } - - private static bool ValidateVersichertenstatus(string status) - { - if (status == null) - return false; - - if (status.Length != 5 && status.Length != 7) - return false; - - return true; - } - - private static bool ValidateLeistungserbringergruppe(string code) - { - if (code == null) - return false; - - if (code.Length != 5 && code.Length != 7) - return false; - - return true; - } - } -} diff --git a/Dakota/Logic/DakotaUtils.cs b/Dakota/Logic/DakotaUtils.cs deleted file mode 100644 index e8fe2b5df..000000000 --- a/Dakota/Logic/DakotaUtils.cs +++ /dev/null @@ -1,84 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Dakota.Logic -{ - public static class DakotaUtils - { - public static string FillFromLeft(string input, int length, char filler) - { - if (input.Length > length) - return input; - - if (input.Length == length) - return input; - - var sb = new StringBuilder(); - for (int i = 0; i < length - input.Length; i++) - { - sb.Append(filler); - } - sb.Append(input); - - return sb.ToString(); - } - - public static string FillFromRight(string input, int length, char filler) - { - if (input.Length > length) - return input; - - if (input.Length == length) - return input; - - var sb = new StringBuilder(); - sb.Append(input); - for (int i = 0; i < length - input.Length; i++) - { - sb.Append(filler); - } - - return sb.ToString(); - } - - public static string GetAbrechnungscode(string leistungserbringergruppe) - { - var len = leistungserbringergruppe.Length; - - if(len == 5) - { - return "69"; - } - else if(len == 7) - { - return leistungserbringergruppe.Substring(0, 2); - } - else - { - throw new ArgumentException($"Leistungserbringergruppe \"{leistungserbringergruppe}\" hat ungültige Anzahl Stellen"); - } - } - - public static string GetTarifkennzeichen(string leistungserbringergruppe) - { - var len = leistungserbringergruppe.Length; - - if (len == 5) - { - return leistungserbringergruppe; - } - else if (len == 7) - { - return leistungserbringergruppe.Substring(2); - // return leistungserbringergruppe.Substring(2, 5); - } - else - { - throw new ArgumentException($"Leistungserbringergruppe \"{leistungserbringergruppe}\" hat ungültige Anzahl Stellen"); - } - } - } -} diff --git a/Dakota/Models/Daten/Datenelement.cs b/Dakota/Models/Daten/Datenelement.cs index 70c1818ab..f448ce627 100644 --- a/Dakota/Models/Daten/Datenelement.cs +++ b/Dakota/Models/Daten/Datenelement.cs @@ -97,7 +97,7 @@ namespace Dakota.Models.Daten throw new DakotaException($"Das Feld \"{Title}\" hat bei der Erstellung {_Value.Length} Stellen ergeben! Nach Vorgabe darf es jedoch maximal {MaxStellen} Stellen haben"); } - var mod_value = DakotaValidator.ClearTextString(value); + var mod_value = DakotaUtils.ClearTextString(value); _Value = mod_value; } diff --git a/Host/GkvAbrechnungView.aspx.cs b/Host/GkvAbrechnungView.aspx.cs index 5e0e8439d..d045693c5 100644 --- a/Host/GkvAbrechnungView.aspx.cs +++ b/Host/GkvAbrechnungView.aspx.cs @@ -36,359 +36,362 @@ using Dakota.Logic; namespace Host { - public partial class GkvAbrechnungView : Page - { - public const int PROCESS_WAITFOREXIT_MS = 10 * 1000; + 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 GETSERVER_URL = "https://support.bewoplaner.de/api/getserver.php?k={0}&t=0"; + private string LOGINSERVER_URL = "{0}/Login.aspx"; - private string ResultFolderPath { get; set; } = ConfigurationManager.AppSettings.Get("GkvAbrechnungResultFolderPath"); - private string QueueFolderPath { get; set; } = ConfigurationManager.AppSettings.Get("GkvAbrechnungQueueFolderPath"); - private string KostentragerdateiFolderPath { get; set; } = ConfigurationManager.AppSettings.Get("GkvKostentragerdateiFolderPath"); + private string ResultFolderPath { get; set; } = ConfigurationManager.AppSettings.Get("GkvAbrechnungResultFolderPath"); + private string QueueFolderPath { get; set; } = ConfigurationManager.AppSettings.Get("GkvAbrechnungQueueFolderPath"); + private string KostentragerdateiFolderPath { get; set; } = ConfigurationManager.AppSettings.Get("GkvKostentragerdateiFolderPath"); - public GkvApp8Request GkvRequest { get; set; } + public GkvApp8Request GkvRequest { get; set; } - protected void Page_Load(object sender, EventArgs e) - { - try - { - //https://app8.bewoplaner.de/Host/GkvAbrechungview?tenant=12345 + protected void Page_Load(object sender, EventArgs e) + { + try + { + //https://app8.bewoplaner.de/Host/GkvAbrechungview?tenant=12345 - var str = new StreamReader(Request.InputStream).ReadToEnd(); + var str = new StreamReader(Request.InputStream).ReadToEnd(); - if (string.IsNullOrEmpty(str)) - SendErrorResponse("Ungültige Eingabe"); + if (string.IsNullOrEmpty(str)) + SendErrorResponse("Ungültige Eingabe"); - GkvRequest = JsonConvert.DeserializeObject(str); + GkvRequest = JsonConvert.DeserializeObject(str); - if (!CheckValues()) - SendErrorResponse("Check Fehlgeschlagen"); + if (!CheckValues()) + SendErrorResponse("Check Fehlgeschlagen"); - if (!TryLogin()) - SendErrorResponse("Login Fehlgeschlagen"); + if (!TryLogin()) + SendErrorResponse("Login Fehlgeschlagen"); - switch (GkvRequest.Type) - { - case GkvAbrechnungApp8RequestTypeDC.SendNew: - SendNew(JsonConvert.DeserializeObject(str)); - return; - case GkvAbrechnungApp8RequestTypeDC.GetStatus: - GetStatus(JsonConvert.DeserializeObject(str)); - return; - case GkvAbrechnungApp8RequestTypeDC.GetIKNumber: - GetIK(JsonConvert.DeserializeObject(str)); - return; - default: - SendErrorResponse("GkvAbrechnungType unbekannt."); - return; - } + switch (GkvRequest.Type) + { + case GkvAbrechnungApp8RequestTypeDC.SendNew: + SendNew(JsonConvert.DeserializeObject(str)); + return; + case GkvAbrechnungApp8RequestTypeDC.GetStatus: + GetStatus(JsonConvert.DeserializeObject(str)); + return; + case GkvAbrechnungApp8RequestTypeDC.GetIKNumber: + GetIK(JsonConvert.DeserializeObject(str)); + return; + default: + SendErrorResponse("GkvAbrechnungType unbekannt."); + return; + } - SendErrorResponse("Unbekannter Fehler"); - } - catch (ThreadAbortException eee) - { + SendErrorResponse("Unbekannter Fehler"); + } + catch (ThreadAbortException eee) + { - } - catch (Exception ex) - { - var ex_text = ex.Message + "\n" + ex.StackTrace; - SendErrorResponse(ex_text); - return; - } - } + } + catch (Exception ex) + { + var ex_text = ex.Message + "\n" + ex.StackTrace; + SendErrorResponse(ex_text); + return; + } + } - private void SendErrorResponse(string message) - { - var response = new GkvApp8Response(); + private void SendErrorResponse(string message) + { + var response = new GkvApp8Response(); - response.Success = false; - response.Message = message; + response.Success = false; + response.Message = message; - SendResponse(JsonConvert.SerializeObject(response)); - } - private void SendResponse(object res) => SendResponse(JsonConvert.SerializeObject(res)); - private void SendResponse(string str) - { - Response.Write(str); + SendResponse(JsonConvert.SerializeObject(response)); + } + private void SendResponse(object res) => SendResponse(JsonConvert.SerializeObject(res)); + private void SendResponse(string str) + { + Response.Write(str); - Response.End(); - //Context.ApplicationInstance.CompleteRequest(); - } + Response.End(); + //Context.ApplicationInstance.CompleteRequest(); + } - private bool CheckValues() => CheckValues(GkvRequest); - private bool CheckValues(GkvApp8Request request) - { - if (request == null) - return false; - if (request.Type == GkvAbrechnungApp8RequestTypeDC.Default) - return false; - if (string.IsNullOrWhiteSpace(request.Username)) - return false; - if (string.IsNullOrWhiteSpace(request.Tenant)) - return false; - if (string.IsNullOrWhiteSpace(request.Password)) - return false; + private bool CheckValues() => CheckValues(GkvRequest); + private bool CheckValues(GkvApp8Request request) + { + if (request == null) + return false; + if (request.Type == GkvAbrechnungApp8RequestTypeDC.Default) + return false; + if (string.IsNullOrWhiteSpace(request.Username)) + return false; + if (string.IsNullOrWhiteSpace(request.Tenant)) + return false; - return true; - } - - private bool TryLogin() => TryLogin(GkvRequest); - private bool TryLogin(GkvApp8Request gkv_request) - { - if (gkv_request.Tenant == "demo" && gkv_request.Username == "demo" && gkv_request.DebugMode == "fozc4897b6ztvf978AFCRRG244fvFV2532fvf324AF") - { - gkv_request.Tenant = "7375324044"; - return true; - } - - var server = GetServerFromTenant(gkv_request.Tenant); - var loginurl = string.Format(LOGINSERVER_URL, $"https://{server}/service"); - -#if DEBUG - //loginurl = string.Format(LOGINSERVER_URL, "https://app4.bewoplaner.de"); - loginurl = string.Format(LOGINSERVER_URL, "http://localhost:3777/Host"); +#if !DEBUG + if (string.IsNullOrWhiteSpace(request.Password)) + return false; #endif - bool successful = false; + return true; + } - try - { - using (WebClient client = new WebClient()) - { - var nvc = new NameValueCollection(); - nvc.Add("password", gkv_request.Password); - nvc.Add("username", gkv_request.Username); - nvc.Add("tenant", gkv_request.Tenant); + private bool TryLogin() => TryLogin(GkvRequest); + private bool TryLogin(GkvApp8Request gkv_request) + { + if (gkv_request.Tenant == "demo" && gkv_request.Username == "demo" && gkv_request.DebugMode == "fozc4897b6ztvf978AFCRRG244fvFV2532fvf324AF") + { + gkv_request.Tenant = "7375324044"; + return true; + } - var loginresponse = client.UploadValues(loginurl, "POST", nvc); + var server = GetServerFromTenant(gkv_request.Tenant); + var loginurl = string.Format(LOGINSERVER_URL, $"https://{server}/service"); - successful = BitConverter.ToBoolean(loginresponse, 0); - } - } - catch (Exception e) - { - throw new DakotaException($"loginurl: {loginurl} | " + e.ToString()); - } +#if DEBUG + //loginurl = string.Format(LOGINSERVER_URL, "https://app4.bewoplaner.de"); + loginurl = string.Format(LOGINSERVER_URL, "http://localhost:3777/Host"); +#endif - return successful; - } + bool successful = false; - private void SendNew(GkvApp8SendNewRequest req) - { - // Response - var response = new GkvApp8SendNewResponse(false); + try + { + using (WebClient client = new WebClient()) + { + var nvc = new NameValueCollection(); + nvc.Add("password", gkv_request.Password); + nvc.Add("username", gkv_request.Username); + nvc.Add("tenant", gkv_request.Tenant); - var protokoll = req.GkvTransferProtokoll; + var loginresponse = client.UploadValues(loginurl, "POST", nvc); - try - { - SaveFileInFileSystem(req, true); + successful = BitConverter.ToBoolean(loginresponse, 0); + } + } + catch (Exception e) + { + throw new DakotaException($"loginurl: {loginurl} | " + e.ToString()); + } - req.GkvTransferProtokoll.SentSuccess = true; + return successful; + } - response.Success = true; - } - catch (DakotaException e) - { - protokoll.Fehlerdatum = DateTime.Now; - protokoll.Fehlerlevel = GkvTransferFehlerlevel.Soft; - protokoll.Fehlertitel = "App8"; - protokoll.Fehlernachricht = e.Message; + private void SendNew(GkvApp8SendNewRequest req) + { + // Response + var response = new GkvApp8SendNewResponse(false); - response.Message = e.Message; - } - catch (Exception e) - { - protokoll.Fehlerdatum = DateTime.Now; - protokoll.Fehlerlevel = GkvTransferFehlerlevel.Soft; - protokoll.Fehlertitel = "App8"; - protokoll.Fehlernachricht = e.Message; + var protokoll = req.GkvTransferProtokoll; - response.Message = e.Message; - } + try + { + SaveFileInFileSystem(req, true); - response.GkvTransferProtokollDC = protokoll; + req.GkvTransferProtokoll.SentSuccess = true; - SendResponse(response); - } - private void GetStatus(GkvApp8GetStatusRequest req) - { - var response = new GkvApp8GetStatusResponse(false); + response.Success = true; + } + catch (DakotaException e) + { + protokoll.Fehlerdatum = DateTime.Now; + protokoll.Fehlerlevel = GkvTransferFehlerlevel.Soft; + protokoll.Fehlertitel = "App8"; + protokoll.Fehlernachricht = e.Message; - var tuple_count = req.Oids.Length; + response.Message = e.Message; + } + catch (Exception e) + { + protokoll.Fehlerdatum = DateTime.Now; + protokoll.Fehlerlevel = GkvTransferFehlerlevel.Soft; + protokoll.Fehlertitel = "App8"; + protokoll.Fehlernachricht = e.Message; - response.Fehler = new GkvApp8FehlerDC[tuple_count]; + response.Message = e.Message; + } - try - { - // Load XML Info - var results = GetResultFile(GkvRequest.Tenant); + response.GkvTransferProtokollDC = protokoll; - if (results is object) - for (int i = 0; i < tuple_count; i++) - { - var gkv_transfer_oid = req.Oids[i]; + SendResponse(response); + } + private void GetStatus(GkvApp8GetStatusRequest req) + { + var response = new GkvApp8GetStatusResponse(false); - if (results.TryGetValue(gkv_transfer_oid, out var fehlerDC)) - { - response.Fehler[i] = fehlerDC; - } - } + var tuple_count = req.Oids.Length; - ClearResultFolder(GkvRequest.Tenant, req.Oids); + response.Fehler = new GkvApp8FehlerDC[tuple_count]; - response.Success = true; - } - catch (DakotaException e) - { - response.Message = e.Message; - } - catch (Exception e) - { - response.Message = e.ToString(); - } + try + { + // Load XML Info + var results = GetResultFile(GkvRequest.Tenant); - SendResponse(response); + if (results is object) + for (int i = 0; i < tuple_count; i++) + { + var gkv_transfer_oid = req.Oids[i]; - return; - } - private void GetIK(GkvApp8GetIKRequest req) - { - var ktd_reader = new DakotaKTDReader(KostentragerdateiFolderPath); + if (results.TryGetValue(gkv_transfer_oid, out var fehlerDC)) + { + response.Fehler[i] = fehlerDC; + } + } - var resolved = ktd_reader.Resolve(req.IKKrankenkasse, req.Abrechnungscode, req.Tarifkennzeichen); + ClearResultFolder(GkvRequest.Tenant, req.Oids); - var response = new GkvApp8GetIKResponse(); + response.Success = true; + } + catch (DakotaException e) + { + response.Message = e.Message; + } + catch (Exception e) + { + response.Message = e.ToString(); + } - response.Success = true; - response.Gefunden = resolved is object; + SendResponse(response); - if (response.Gefunden) - { - response.IKDatenannahmestelle = resolved.Item1; - response.IKKostentrager = resolved.Item2; - response.IKKrankenkasse = resolved.Item3; - response.BezDatenannahmestelle = resolved.Item4; - } + return; + } + private void GetIK(GkvApp8GetIKRequest req) + { + var ktd_reader = new DakotaKTDReader(KostentragerdateiFolderPath); - SendResponse(response); - } + var resolved = ktd_reader.Resolve(req.IKKrankenkasse, req.Abrechnungscode, req.Tarifkennzeichen); - private string SaveFileInFileSystem(GkvApp8SendNewRequest req, bool debug_mode = false) - => SaveFileInFileSystem(req.GkvTransferProtokoll.GkvTransferProtokollOid.Value, GkvRequest.Tenant, req.GkvTransferProtokoll.IKDatenannahmestelle, req.GkvTransferProtokoll.Transfername, - req.GkvTransferProtokoll.Nutzdatendatei, req.GkvTransferProtokoll.Auftragsdatei, debug_mode); - 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 = QueueFolderPath; - file_path = $@"{tenant}_{protokoll_oid}_{datenannahmestelle}_{transfername}"; - } - else - { - throw new DakotaException("No Debugmode impl"); - //root_path = $@"C:\GkvAbrechnung\{tenant}\{datenannahmestelle}\"; - //file_path = $@"{transfername}"; - } + var response = new GkvApp8GetIKResponse(); - Directory.CreateDirectory(root_path); + response.Success = true; + response.Gefunden = resolved is object; - var finalpath = root_path + file_path; + if (response.Gefunden) + { + response.IKDatenannahmestelle = resolved.Item1; + response.IKKostentrager = resolved.Item2; + response.IKKrankenkasse = resolved.Item3; + response.BezDatenannahmestelle = resolved.Item4; + } - return SaveFileInFileSystem(finalpath, nutzdaten, auftragsdatei); - } - private string SaveFileInFileSystem(string finalpath, string nutzdaten, string auftragsdatei) - { - File.WriteAllText(finalpath, nutzdaten); + SendResponse(response); + } - var auftragsdatei2 = Encoding.GetEncoding("ISO-8859-1").GetBytes(auftragsdatei); + private string SaveFileInFileSystem(GkvApp8SendNewRequest req, bool debug_mode = false) + => SaveFileInFileSystem(req.GkvTransferProtokoll.GkvTransferProtokollOid.Value, GkvRequest.Tenant, req.GkvTransferProtokoll.IKDatenannahmestelle, req.GkvTransferProtokoll.Transfername, + req.GkvTransferProtokoll.Nutzdatendatei, req.GkvTransferProtokoll.Auftragsdatei, debug_mode); + 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 = QueueFolderPath; + file_path = $@"{tenant}_{protokoll_oid}_{datenannahmestelle}_{transfername}"; + } + else + { + throw new DakotaException("No Debugmode impl"); + //root_path = $@"C:\GkvAbrechnung\{tenant}\{datenannahmestelle}\"; + //file_path = $@"{transfername}"; + } - File.WriteAllBytes(finalpath + ".auf", auftragsdatei2); + Directory.CreateDirectory(root_path); - return finalpath; - } + var finalpath = root_path + file_path; - private string GetServerFromTenant(string tenant) - { - try - { + return SaveFileInFileSystem(finalpath, nutzdaten, auftragsdatei); + } + private string SaveFileInFileSystem(string finalpath, string nutzdaten, string auftragsdatei) + { + File.WriteAllText(finalpath, nutzdaten); - String url = String.Format(GETSERVER_URL, tenant); - using (WebClient client = new WebClient()) - { - //MessageBox.Show(hostAddress); - byte[] response = client.UploadValues(url, "POST", new NameValueCollection()); + var auftragsdatei2 = Encoding.GetEncoding("ISO-8859-1").GetBytes(auftragsdatei); - String server = System.Text.Encoding.ASCII.GetString(response); + File.WriteAllBytes(finalpath + ".auf", auftragsdatei2); - return server; - } - } - catch (Exception ex) - { - return null; - } - } + return finalpath; + } - private void ClearResultFolder(string tenant, long[] oids) - { - var folder = new DirectoryInfo(Path.Combine(ResultFolderPath, tenant)); + private string GetServerFromTenant(string tenant) + { + try + { - if (!folder.Exists) - return; + String url = String.Format(GETSERVER_URL, tenant); + using (WebClient client = new WebClient()) + { + //MessageBox.Show(hostAddress); + byte[] response = client.UploadValues(url, "POST", new NameValueCollection()); - foreach (var file in folder.GetFiles()) - { - var xml_obj = GkvApp8FehlerXml.GetFehlerXml(file.FullName); + String server = System.Text.Encoding.ASCII.GetString(response); - if (xml_obj is GkvApp8FehlerXml xml && oids.Contains(xml.Oid)) - continue; + return server; + } + } + catch (Exception ex) + { + return null; + } + } - file.Delete(); - } - } - private Dictionary GetResultFile(string tenant) - { - try - { - var path = ResultFolderPath; + private void ClearResultFolder(string tenant, long[] oids) + { + var folder = new DirectoryInfo(Path.Combine(ResultFolderPath, tenant)); - if (string.IsNullOrWhiteSpace(path)) - throw new DakotaException("Config GkvAbrechnungResultFolderPath is empty or whitespace"); + if (!folder.Exists) + return; - if (string.IsNullOrWhiteSpace(tenant)) - throw new DakotaException("Tenant is empty or whitespace"); + foreach (var file in folder.GetFiles()) + { + var xml_obj = GkvApp8FehlerXml.GetFehlerXml(file.FullName); - var folder = new DirectoryInfo(Path.Combine(path, tenant)); + if (xml_obj is GkvApp8FehlerXml xml && oids.Contains(xml.Oid)) + continue; - if (!folder.Exists) - { - return null; - } - - var dict = new Dictionary(); - foreach (var file in folder.GetFiles("*.xml")) - { - var xml = GkvApp8FehlerXml.GetFehlerXml(file.FullName); + file.Delete(); + } + } + private Dictionary GetResultFile(string tenant) + { + try + { + var path = ResultFolderPath; - if (xml is null) - continue; + if (string.IsNullOrWhiteSpace(path)) + throw new DakotaException("Config GkvAbrechnungResultFolderPath is empty or whitespace"); - dict.Add(xml.Oid, GkvApp8FehlerXml.ToDC(xml)); - } - return dict; - } - catch (DakotaException e) - { - throw e; - } - catch (Exception e) - { - throw new DakotaException("App8 Server Error: " + e.ToString()); - } - } - } + if (string.IsNullOrWhiteSpace(tenant)) + throw new DakotaException("Tenant is empty or whitespace"); + + var folder = new DirectoryInfo(Path.Combine(path, tenant)); + + if (!folder.Exists) + { + return null; + } + + var dict = new Dictionary(); + foreach (var file in folder.GetFiles("*.xml")) + { + var xml = GkvApp8FehlerXml.GetFehlerXml(file.FullName); + + if (xml is null) + continue; + + dict.Add(xml.Oid, GkvApp8FehlerXml.ToDC(xml)); + } + return dict; + } + catch (DakotaException e) + { + throw e; + } + catch (Exception e) + { + throw new DakotaException("App8 Server Error: " + e.ToString()); + } + } + } } \ No newline at end of file diff --git a/Host/Login.aspx.cs b/Host/Login.aspx.cs index ab90666ab..9e0fd5741 100644 --- a/Host/Login.aspx.cs +++ b/Host/Login.aspx.cs @@ -20,6 +20,9 @@ namespace Host var username = Request.Form["username"]; var password = Request.Form["password"]; + if (string.IsNullOrEmpty(password)) + password = null; + var user = DAOFactory.UserDAO.FindUserByLoginName(username); var result = user.BCryptPassword == password; diff --git a/Model/Changes_2024_10_16 Organisation Erprobungsverfahren Default.txt b/Model/Changes_2024_10_16 Organisation Erprobungsverfahren Default.txt new file mode 100644 index 000000000..910547095 --- /dev/null +++ b/Model/Changes_2024_10_16 Organisation Erprobungsverfahren Default.txt @@ -0,0 +1,2 @@ +ALTER TABLE `organisation` +CHANGE COLUMN `Verfahrensstufe` `Verfahrensstufe` INT NULL DEFAULT '1' ; diff --git a/Service/ServiceContracts/IAccountingService.cs b/Service/ServiceContracts/IAccountingService.cs index 7c1f800fd..238797f3d 100644 --- a/Service/ServiceContracts/IAccountingService.cs +++ b/Service/ServiceContracts/IAccountingService.cs @@ -164,5 +164,9 @@ namespace BeWo.Service.ServiceContracts [FaultContract(typeof(BeWoFault))] [OperationContract] GkvAbrechnungSendResponseDC SendNewGkvAbrechnung(GkvAbrechnungSendRequestDC req); + + [FaultContract(typeof(BeWoFault))] + [OperationContract] + GkvApp8GetIKResponse SendApp8GetIKRequest(GkvApp8GetIKRequest req); } } \ No newline at end of file diff --git a/Service/ServiceImplementations/AccountingServiceImp.cs b/Service/ServiceImplementations/AccountingServiceImp.cs index 92034611f..989046950 100644 --- a/Service/ServiceImplementations/AccountingServiceImp.cs +++ b/Service/ServiceImplementations/AccountingServiceImp.cs @@ -28,1203 +28,1219 @@ using BS.Shared.Extensions; namespace BeWo.Service.ServiceImplementations { - [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall, ConcurrencyMode = ConcurrencyMode.Single)] - public class AccountingServiceImp : IAccountingService - { - public void DeactivateInvoiceBases(List invoices) - { - try - { - var s = PluginLoader.FindClass(); - s.DeactivateInvoiceBases(invoices); - - - } - catch (Exception e) - { - throw Utils.CreateBeWoFaultException(e); - } - } - - public void StorniereInvoiceBases(List invoices) - { - try - { - var s = PluginLoader.FindClass(); - s.StorniereInvoiceBases(invoices); - - - } - catch (Exception e) - { - throw Utils.CreateBeWoFaultException(e); - } - } - - public void DeactivateServiceInvoices(List invoices) - { - try - { - var s = PluginLoader.FindClass(); - s.DeactivateServiceInvoices(invoices); - } - catch (Exception e) - { - throw Utils.CreateBeWoFaultException(e); - } - } - - public void DeactivateSettlementInvoice(List invoices) - { - try - { - ServiceLogic.SetActivationType(invoices.ToDictionary(i => i.SettlementIvoiceOid.Value, i => i.SettlementInvoiceVersion.Value), ActivationTypeId.Deleted); - ServiceLogic.SetActivationType(invoices.ToDictionary(i => i.InvoiceBaseOid.Value, i => i.InvoiceBaseVersion.Value), ActivationTypeId.Deleted); - } - catch (Exception e) - { - throw Utils.CreateBeWoFaultException(e); - } - } - - public List GenerateInitialServiceInvoices( - long costBearerOid, - long? supportConceptOid, - DateTimeSpan invoicePeriod) - { - try - { - var acc = PluginLoader.FindClass(); - return acc.GenerateInitialServiceInvoices(costBearerOid, supportConceptOid, invoicePeriod); - - } - catch (Exception e) - { - throw Utils.CreateBeWoFaultException(e); - } - } - - public List GetAllActiveInvoiceBases() - { - try - { - return MapperFactory.InvoiceBaseDC_InvoiceBase.MapToNewDCs(DAOFactory.GenericDAO.GetAllActive()); - } - catch (Exception e) - { - throw Utils.CreateBeWoFaultException(e); - } - } - - public List GetInvoiceBases(DateTime? startDate, DateTime? endDate) - { - try - { - var s = PluginLoader.FindClass(); - - return s.GetInvoiceBases(startDate, endDate); - - } - catch (Exception e) - { - throw Utils.CreateBeWoFaultException(e); - } - } - - public List GetInvoiceBases2(DateTime? startDate, DateTime? endDate, bool filterByInvoiceDate) - { - try - { - var s = PluginLoader.FindClass(); - - return s.GetInvoiceBases(startDate, endDate, filterByInvoiceDate); - - } - catch (Exception e) - { - throw Utils.CreateBeWoFaultException(e); - } - } - - public List GetInvoiceBasesForCostBearerAndId(DateTime? startDate, DateTime? endDate, long costBearerOid, String invoiceId) - { - try - { - var s = PluginLoader.FindClass(); - - return s.GetInvoiceBases(startDate, endDate, costBearerOid, invoiceId); - } - catch (Exception e) - { - throw Utils.CreateBeWoFaultException(e); - } - } - - public List GetGeneralInvoiceBasesForCustomer(long customerOid) - { - try - { - return MapperFactory.InvoiceBaseDC_InvoiceBase.MapToNewDCs(DAOFactory.SearchDAO.GetInvoiceBaseByCustomerOid(InvoiceType.General, customerOid)); - } - catch (Exception e) - { - throw Utils.CreateBeWoFaultException(e); - } - } - - public List GetGeneralInvoiceBasesForOrganisation(long organisationOid) - { - try - { - return MapperFactory.InvoiceBaseDC_InvoiceBase.MapToNewDCs(DAOFactory.SearchDAO.GetInvoiceBaseByOrganisationOid(InvoiceType.General, organisationOid)); - } - catch (Exception e) - { - throw Utils.CreateBeWoFaultException(e); - } - } - - public List GetGeneralInvoiceBasesForPerson(long personOid) - { - try - { - return MapperFactory.InvoiceBaseDC_InvoiceBase.MapToNewDCs(DAOFactory.SearchDAO.GetInvoiceBaseByPersonOid(InvoiceType.General, personOid)); - } - catch (Exception e) - { - throw Utils.CreateBeWoFaultException(e); - } - } - - public List GetInvoiceBasesForSupportConcept(InvoiceType type, long supportConceptOid) - { - try - { - return MapperFactory.InvoiceBaseDC_InvoiceBase.MapToNewDCs(DAOFactory.SearchDAO.GetInvoiceBaseByTypeAndSupportConceptOid(type, supportConceptOid)); - } - catch (Exception e) - { - throw Utils.CreateBeWoFaultException(e); - } - } - - public ServiceInvoiceDC GetServiceInvoiceByInvoiceBaseOid(long invoiceBaseOid) - { - try - { - var dc = MapperFactory.ServiceInvoiceDC_ServiceInvoice.MapToNewDC(DAOFactory.SearchDAO.GetServiceInvoiceByInvoiceBaseOid(invoiceBaseOid)); - - SortServiceInvoicePeriods(dc); - return dc; - } - catch (Exception e) - { - throw Utils.CreateBeWoFaultException(e); - } - } - - public List GetServiceInvoices(long costBearerOid, long? supportConceptOid, DateTimeSpan period) - { - try - { - List entities = DAOFactory.SearchDAO.GetServiceInvoices(costBearerOid, supportConceptOid, period); - entities.Sort((x, y) => - { - if (y.InvoiceBase.InvoiceDate.Value.Date.Equals(x.InvoiceBase.InvoiceDate.Value.Date)) - { - return y.InvoiceBase.InvoiceNumber.CompareTo(x.InvoiceBase.InvoiceNumber); - } - - return y.InvoiceBase.InvoiceDate.Value.Date.CompareTo(x.InvoiceBase.InvoiceDate.Value.Date); - }); - - var dcList = MapperFactory.ServiceInvoiceDC_ServiceInvoice.MapToNewDCs(entities); - - foreach (var serviceInvoice in dcList) - { - SortServiceInvoicePeriods(serviceInvoice); - } - return dcList; - } - catch (Exception e) - { - throw Utils.CreateBeWoFaultException(e); - } - } - - private void SortServiceInvoicePeriods(ServiceInvoiceDC serviceInvoice) - { - if (serviceInvoice.ServiceInvoicePeriods != null) - { - serviceInvoice.ServiceInvoicePeriods.Sort((x, y) => - { - if (x.Customer != null && y.Customer != null) - return x.Customer.ToString().CompareTo(y.Customer.ToString()); - else if (x.Start != null && y.Start != null) - { - x.Start.Value.CompareTo(y.Start.Value); - } - return 0; - }); - } - } - - public Settlement2DC GetSettlementByInvoiceBaseOid(long invoiceBaseOid) - { - try - { - return MapperFactory.SettlementDC_SettlementInvoice.MapToNewDC(DAOFactory.SearchDAO.GetSettlementInvoiceByInvoiceBaseOid(invoiceBaseOid)); - } - catch (Exception e) - { - throw Utils.CreateBeWoFaultException(e); - } - } - - public List GetSettlementInvoicesForCostBearerAndPeriod(long costBearerOid, DateTime periodStart, DateTime periodEnd) - { - try - { - return MapperFactory.SettlementDC_SettlementInvoice.MapToNewDCs(DAOFactory.SearchDAO.GetSettlementInvoicesForCostBearerAndPeriod(costBearerOid, periodStart, periodEnd)); - } - catch (Exception e) - { - throw Utils.CreateBeWoFaultException(e); - } - } - - public List GetSettlementInvoicesForSupportConcept(long supportConceptOid) - { - try - { - return MapperFactory.SettlementDC_SettlementInvoice.MapToNewDCs(DAOFactory.SearchDAO.GetSettlementInvoiceBySupportConceptOid(supportConceptOid)); - } - catch (Exception e) - { - throw Utils.CreateBeWoFaultException(e); - } - } - - public List InsertNewInvoiceBases(List invoices) - { - try - { - if (invoices != null && LoggedInUserOperationContextExt.Current != null && - LoggedInUserOperationContextExt.Current.User != null) - { - var loggedInUser = LoggedInUserOperationContextExt.Current.User; - - foreach (var ib in invoices) - { - ib.SenderContactInformations = new List(); - - - foreach (var contact in loggedInUser.Employee.Person.Contacts) - { - var newContact = new ContactDC(); - newContact.ContactType = contact.Type; - newContact.ContactValue = contact.Value; - - ib.SenderContactInformations.Add(newContact); - } - } - - - } - - var newInvoices = MapperFactory.InvoiceBaseDC_InvoiceBase.MapToNewEntities(invoices); - int count = 0; - - var inc = PluginLoader.FindClass(); - - foreach (var ib in newInvoices) - { - if (ib.Type == InvoiceType.General) - { - foreach (var item in ib.InvoiceItems) - { - item.AmountTotal = Math.Round(item.AmountTotal ?? 0, 2, MidpointRounding.AwayFromZero); - } - } - var nextNumber = inc.GetNextInvoiceNumber(count, ib); - if (!String.IsNullOrEmpty(nextNumber)) - { - if (!String.IsNullOrEmpty(ib.InvoiceNumber)) // Rechnungsnummer schon vorher erzeugt oder per Hand vergeben. - { - if (ib.InvoiceNumber == nextNumber) - //Die per Hand vergebene Rechnungsnummer ist gleich der nächsten berechneten Rechnungsnummer, daher Rechnungsnummerzähler erhöhen - { - count++; - } - } - else - { - ib.InvoiceNumber = nextNumber; - count++; - } - } - } - - var factory = PluginLoader.FindClass(); - - if (factory != null) - { - foreach (var ib in newInvoices) - { - if (ib.Type == InvoiceType.CustomerEquity) - { - var creator = factory.CreateEquityInvoiceCreator(ib); - creator.InitEquityInvoice(ib); - } - else if (ib.Type == InvoiceType.General) - { - var creator = factory.CreateGeneralInvoiceCreator(ib); - creator.InitInvoice(ib); - } - } - - - } - - - - DAOFactory.GenericDAO.Insert(newInvoices); - - inc.IncreaseInvoiceNumber(count, newInvoices); - - return newInvoices.Select(i => i.Oid.Value).ToList(); - } - catch (Exception e) - { - throw Utils.CreateBeWoFaultException(e); - } - } - - public List InsertNewServiceInvoices(List invoices) - { - try - { - //Prüfe Flags - var neueRechnungen = new List(); - var diffRechnungen = invoices.Where(i => i.InvoiceBase.DiffErstellen).ToList(); - - //Bei neuer Rechung prüfen, ob eine Diff Rechnung vorher generiert wurde. - foreach (var item in invoices.Where(i => i.InvoiceBase.NeuErstellen)) - { - if (item.OriginalZurDifferenz != null) - { - neueRechnungen.Add(item.OriginalZurDifferenz); - } - else - { - neueRechnungen.Add(item); - } - } - - var newInvoices = MapperFactory.ServiceInvoiceDC_ServiceInvoice.MapToNewEntities(neueRechnungen); - newInvoices.AddRange(MapperFactory.ServiceInvoiceDC_ServiceInvoice.MapToNewEntities(diffRechnungen)); - if (newInvoices.Count > 0) - { - int count = 0; - var inc = PluginLoader.FindClass(); - - foreach (var i in newInvoices) - { - var nextNumber = inc.GetNextInvoiceNumber(count, i.InvoiceBase); - if (!String.IsNullOrEmpty(nextNumber)) - { - //if (!String.IsNullOrEmpty(i.InvoiceBase.InvoiceNumber) && newInvoices.Count == 1) - // // Rechnungsnummer schon vorher erzeugt oder per Hand vergeben. - //{ - // if (i.InvoiceBase.InvoiceNumber == nextNumber || newInvoices.Count > 1) - // //Die per Hand vergebene Rechnungsnummer ist gleich der nächsten berechneten Rechnungsnummer, daher Rechnungsnummerzähler erhöhen - // { - // count++; - // } - //} - //else - //{ - i.InvoiceBase.InvoiceNumber = nextNumber; - count++; - //} - } - } - - DAOFactory.GenericDAO.Insert(newInvoices); - - inc.IncreaseInvoiceNumberForServiceInvoices(count, newInvoices); - } - return newInvoices.Select(i => i.Oid.Value).ToList(); - } - catch (Exception e) - { - throw Utils.CreateBeWoFaultException(e); - } - } - - - public List InsertNewSettlementInvoice(List invoices) - { - try - { - - var newInvoices = MapperFactory.SettlementDC_SettlementInvoice.MapToNewEntities(invoices); - int count = 0; - var inc = PluginLoader.FindClass(); - - foreach (var i in newInvoices) - { - var nextNumber = inc.GetNextInvoiceNumber(count, i.InvoiceBase); - if (!String.IsNullOrEmpty(nextNumber)) - { - if (!String.IsNullOrEmpty(i.InvoiceBase.InvoiceNumber)) // Rechnungsnummer schon vorher erzeugt oder per Hand vergeben. - { - if (i.InvoiceBase.InvoiceNumber == nextNumber) - //Die per Hand vergebene Rechnungsnummer ist gleich der nächsten berechneten Rechnungsnummer, daher Rechnungsnummerzähler erhöhen - { - count++; - } - } - else - { - i.InvoiceBase.InvoiceNumber = nextNumber; - count++; - } - } - } - - DAOFactory.GenericDAO.Insert(newInvoices); - - inc.IncreaseInvoiceNumber(count, newInvoices); - return newInvoices.Select(i => i.Oid.Value).ToList(); - } - catch (Exception e) - { - throw Utils.CreateBeWoFaultException(e); - } - } - - public InvoiceBaseDC LoadInvoiceBaseByOid(long invoiceBaseOid) - { - try - { - var r = MapperFactory.InvoiceBaseDC_InvoiceBase.MapToNewDC( - DAOFactory.GenericDAO.LoadByID(invoiceBaseOid)); - - if (r.Type == InvoiceType.Settlement && r.SupportConceptOid != null) - { - SupportConcept sc = DAOFactory.GenericDAO.LoadByID(r.SupportConceptOid.Value); - r.CustomerFirstName = sc.Customer.Person.FirstName; - r.CustomerLastName = sc.Customer.Person.LastName; - - } - - return r; - } - catch (Exception e) - { - throw Utils.CreateBeWoFaultException(e); - } - } - - public InvoiceNumberDC LoadInvoiceNumber() - { - try - { - var inr = DAOFactory.GenericDAO.LoadByID(1); - if (inr != null) - return MapperFactory.InvoiceNumberDC_InvoiceNumber.MapToNewDC(inr); - return null; - } - catch (Exception e) - { - throw Utils.CreateBeWoFaultException(e); - } - } - - public ServiceInvoiceDC LoadServiceInvoiceByOid(long serviceInvoiceOid) - { - try - { - var r = MapperFactory.ServiceInvoiceDC_ServiceInvoice.MapToNewDC(DAOFactory.GenericDAO.LoadByID(serviceInvoiceOid)); - - return r; - } - catch (Exception e) - { - throw Utils.CreateBeWoFaultException(e); - } - } - - public List UpdateInvoiceBases(List invoices) - { - try - { - var originals = DAOFactory.GenericDAO.LoadByIDs(invoices.Select(i => i.InvoiceBaseOid.Value)); - bool macheMerge = true; - foreach (var entity in originals) - { - var dc = invoices.Where(i => i.InvoiceBaseOid == entity.Oid).FirstOrDefault(); - - - if (dc.IsPaid != entity.IsPaid || - dc.IsExported != entity.IsExported || - dc.IsReviewed != entity.IsReviewed || - dc.IsSent != entity.IsSent || - dc.PartialPayment != entity.PartialPayment) - { - //Kann nur über die Rechnungsübersicht geändert werden, daher kein Merge mit dem dc machen! - entity.IsPaid = dc.IsPaid; - entity.IsExported = dc.IsExported; - entity.IsReviewed = dc.IsReviewed; - entity.IsSent = dc.IsSent; - entity.PartialPayment = dc.PartialPayment; - macheMerge = false; - DAOFactory.GenericDAO.Update(entity); - } - } - - if (macheMerge) - { - MapperFactory.InvoiceBaseDC_InvoiceBase.MergeWithEntitys(invoices, originals); - DAOFactory.GenericDAO.Update(originals); - } - return originals.Select(e => e.Version.Value).ToList(); - } - catch (Exception e) - { - throw Utils.CreateBeWoFaultException(e); - } - } - - public List SetInvoicePaid(List invoices, bool isPaid) - { - try - { - var originals = DAOFactory.GenericDAO.LoadByIDs(invoices.Select(i => i.InvoiceBaseOid.Value)); - foreach (var invoiceBase in originals) - { - invoiceBase.IsPaid = isPaid; - } - DAOFactory.GenericDAO.Update(originals); - return originals.Select(e => e.Version.Value).ToList(); - } - catch (Exception e) - { - throw Utils.CreateBeWoFaultException(e); - } - } - - public InvoiceNumberDC UpdateInvoiceNumber(InvoiceNumberDC dc) - { - try - { - - var old = DAOFactory.GenericDAO.LoadByID(1); - MapperFactory.InvoiceNumberDC_InvoiceNumber.MergeWithEntity(dc, old); - DAOFactory.GenericDAO.Update(old); - - return MapperFactory.InvoiceNumberDC_InvoiceNumber.MapToNewDC(old); - } - catch (Exception e) - { - throw Utils.CreateBeWoFaultException(e); - } - } - - public List UpdateServiceInvoices(List invoices) - { - var acc = PluginLoader.FindClass(); - return acc.UpdateServiceInvoices(invoices); - } - - public void UpdateSettlementInvoice(List invoices) - { - try - { - var originals = DAOFactory.GenericDAO.LoadByIDs(invoices.Select(i => i.SettlementIvoiceOid.Value)); - MapperFactory.SettlementDC_SettlementInvoice.MergeWithEntitys(invoices, originals); - - //originals.ForEach( - // i => - // { - //i.InvoiceBase.Type = InvoiceType.Settlement; - - // We´ll add an invoiceitem, so we can treat a settlement like any other invoice - //i.InvoiceBase.InvoiceItems.Clear(); - //i.InvoiceBase.InvoiceItems.Add( - // new InvoiceItem - // { - // AmountTotal = i.Claim, - // ItemPeriodStart = i.InvoiceBase.AccountingPeriodStart, - // ItemPeriodEnd = i.InvoiceBase.AccountingPeriodEnd, - // ItemDescription = "Spitzabrechung" - // }); - //}); - DAOFactory.GenericDAO.Update(originals); - } - catch (Exception e) - { - throw Utils.CreateBeWoFaultException(e); - } - } - - - public List LoadInvoiceNumberList() - { - try - { - var numbers = DAOFactory.GenericDAO.GetAllActive(); - - return MapperFactory.InvoiceNumberDC_InvoiceNumber.MapToNewDCs(numbers); - - } - catch (Exception e) - { - throw Utils.CreateBeWoFaultException(e); - } - } - - public List UpdateInvoiceNumberList(List dclist) - { - try - { - var numbers = DAOFactory.GenericDAO.GetAllActive(); - - MapperFactory.InvoiceNumberDC_InvoiceNumber.MergeWithEntitys(dclist, numbers); - DAOFactory.GenericDAO.Update(numbers); - - return MapperFactory.InvoiceNumberDC_InvoiceNumber.MapToNewDCs(numbers); - } - catch (Exception e) - { - 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; - - var entities = DAOFactory.SearchDAO.GetGkvAbrechnungen(start, end, filter); - - return MapperFactory.GkvAbrechnungDC_GkvAbrechnung.MapToNewDCs(entities); - } - catch (Exception e) - { - throw Utils.CreateBeWoFaultException(e); - } - } - public List GetAllGkvAbrechnungen() - { - try - { - var user = LoggedInUserOperationContextExt.Current?.User ?? SessionFacade.LoggedInUser; - - var entries = DAOFactory.GenericDAO.GetAllActive(); - - var dcs = MapperFactory.GkvAbrechnungDC_GkvAbrechnung.MapToNewDCs(entries); - - var updateables = dcs.Where(x => x.IsWaiting()).ToArray(); - - if (!updateables.Any()) - return dcs; - - var isUpToDate = SendApp8GetStatusRequest(updateables); - - if (isUpToDate) - return dcs; - - entries = DAOFactory.GenericDAO.GetAllActive(); - - dcs = MapperFactory.GkvAbrechnungDC_GkvAbrechnung.MapToNewDCs(entries); - - return dcs; - } - catch (Exception e) - { - throw Utils.CreateBeWoFaultException(e); - } - } - - public GkvAbrechnungResponseDC CreateNewGkvAbrechnung(GkvAbrechnungRequestDC request) - { - var response = new GkvAbrechnungResponseDC(); - - try - { - 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.GetOrganisation(); - - gkv_abrechnung.Verfahrensstufe = orga.Verfahrensstufe; - - decimal gesamt = 0; - foreach (var invoicebase_oid in request.SelectedInvoiceBases) - { - var service = DAOFactory.SearchDAO.GetServiceInvoiceByInvoiceBaseOid(invoicebase_oid); - var invoicebase = DAOFactory.GenericDAO.GetByID(invoicebase_oid); - - var invoicebase_dc = MapperFactory.InvoiceBaseDC_InvoiceBase.MapToNewDC(invoicebase); - - 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; - - return response; - } - catch (DakotaException exc) - { - response.Error = exc.Message; - } - catch (Exception e) - { - 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); + [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall, ConcurrencyMode = ConcurrencyMode.Single)] + public class AccountingServiceImp : IAccountingService + { + public void DeactivateInvoiceBases(List invoices) + { + try + { + var s = PluginLoader.FindClass(); + s.DeactivateInvoiceBases(invoices); + + + } + catch (Exception e) + { + throw Utils.CreateBeWoFaultException(e); + } + } + + public void StorniereInvoiceBases(List invoices) + { + try + { + var s = PluginLoader.FindClass(); + s.StorniereInvoiceBases(invoices); + + + } + catch (Exception e) + { + throw Utils.CreateBeWoFaultException(e); + } + } + + public void DeactivateServiceInvoices(List invoices) + { + try + { + var s = PluginLoader.FindClass(); + s.DeactivateServiceInvoices(invoices); + } + catch (Exception e) + { + throw Utils.CreateBeWoFaultException(e); + } + } + + public void DeactivateSettlementInvoice(List invoices) + { + try + { + ServiceLogic.SetActivationType(invoices.ToDictionary(i => i.SettlementIvoiceOid.Value, i => i.SettlementInvoiceVersion.Value), ActivationTypeId.Deleted); + ServiceLogic.SetActivationType(invoices.ToDictionary(i => i.InvoiceBaseOid.Value, i => i.InvoiceBaseVersion.Value), ActivationTypeId.Deleted); + } + catch (Exception e) + { + throw Utils.CreateBeWoFaultException(e); + } + } + + public List GenerateInitialServiceInvoices( + long costBearerOid, + long? supportConceptOid, + DateTimeSpan invoicePeriod) + { + try + { + var acc = PluginLoader.FindClass(); + return acc.GenerateInitialServiceInvoices(costBearerOid, supportConceptOid, invoicePeriod); + + } + catch (Exception e) + { + throw Utils.CreateBeWoFaultException(e); + } + } + + public List GetAllActiveInvoiceBases() + { + try + { + return MapperFactory.InvoiceBaseDC_InvoiceBase.MapToNewDCs(DAOFactory.GenericDAO.GetAllActive()); + } + catch (Exception e) + { + throw Utils.CreateBeWoFaultException(e); + } + } + + public List GetInvoiceBases(DateTime? startDate, DateTime? endDate) + { + try + { + var s = PluginLoader.FindClass(); + + return s.GetInvoiceBases(startDate, endDate); + + } + catch (Exception e) + { + throw Utils.CreateBeWoFaultException(e); + } + } + + public List GetInvoiceBases2(DateTime? startDate, DateTime? endDate, bool filterByInvoiceDate) + { + try + { + var s = PluginLoader.FindClass(); + + return s.GetInvoiceBases(startDate, endDate, filterByInvoiceDate); + + } + catch (Exception e) + { + throw Utils.CreateBeWoFaultException(e); + } + } + + public List GetInvoiceBasesForCostBearerAndId(DateTime? startDate, DateTime? endDate, long costBearerOid, String invoiceId) + { + try + { + var s = PluginLoader.FindClass(); + + return s.GetInvoiceBases(startDate, endDate, costBearerOid, invoiceId); + } + catch (Exception e) + { + throw Utils.CreateBeWoFaultException(e); + } + } + + public List GetGeneralInvoiceBasesForCustomer(long customerOid) + { + try + { + return MapperFactory.InvoiceBaseDC_InvoiceBase.MapToNewDCs(DAOFactory.SearchDAO.GetInvoiceBaseByCustomerOid(InvoiceType.General, customerOid)); + } + catch (Exception e) + { + throw Utils.CreateBeWoFaultException(e); + } + } + + public List GetGeneralInvoiceBasesForOrganisation(long organisationOid) + { + try + { + return MapperFactory.InvoiceBaseDC_InvoiceBase.MapToNewDCs(DAOFactory.SearchDAO.GetInvoiceBaseByOrganisationOid(InvoiceType.General, organisationOid)); + } + catch (Exception e) + { + throw Utils.CreateBeWoFaultException(e); + } + } + + public List GetGeneralInvoiceBasesForPerson(long personOid) + { + try + { + return MapperFactory.InvoiceBaseDC_InvoiceBase.MapToNewDCs(DAOFactory.SearchDAO.GetInvoiceBaseByPersonOid(InvoiceType.General, personOid)); + } + catch (Exception e) + { + throw Utils.CreateBeWoFaultException(e); + } + } + + public List GetInvoiceBasesForSupportConcept(InvoiceType type, long supportConceptOid) + { + try + { + return MapperFactory.InvoiceBaseDC_InvoiceBase.MapToNewDCs(DAOFactory.SearchDAO.GetInvoiceBaseByTypeAndSupportConceptOid(type, supportConceptOid)); + } + catch (Exception e) + { + throw Utils.CreateBeWoFaultException(e); + } + } + + public ServiceInvoiceDC GetServiceInvoiceByInvoiceBaseOid(long invoiceBaseOid) + { + try + { + var dc = MapperFactory.ServiceInvoiceDC_ServiceInvoice.MapToNewDC(DAOFactory.SearchDAO.GetServiceInvoiceByInvoiceBaseOid(invoiceBaseOid)); + + SortServiceInvoicePeriods(dc); + return dc; + } + catch (Exception e) + { + throw Utils.CreateBeWoFaultException(e); + } + } + + public List GetServiceInvoices(long costBearerOid, long? supportConceptOid, DateTimeSpan period) + { + try + { + List entities = DAOFactory.SearchDAO.GetServiceInvoices(costBearerOid, supportConceptOid, period); + entities.Sort((x, y) => + { + if (y.InvoiceBase.InvoiceDate.Value.Date.Equals(x.InvoiceBase.InvoiceDate.Value.Date)) + { + return y.InvoiceBase.InvoiceNumber.CompareTo(x.InvoiceBase.InvoiceNumber); + } + + return y.InvoiceBase.InvoiceDate.Value.Date.CompareTo(x.InvoiceBase.InvoiceDate.Value.Date); + }); + + var dcList = MapperFactory.ServiceInvoiceDC_ServiceInvoice.MapToNewDCs(entities); + + foreach (var serviceInvoice in dcList) + { + SortServiceInvoicePeriods(serviceInvoice); + } + return dcList; + } + catch (Exception e) + { + throw Utils.CreateBeWoFaultException(e); + } + } + + private void SortServiceInvoicePeriods(ServiceInvoiceDC serviceInvoice) + { + if (serviceInvoice.ServiceInvoicePeriods != null) + { + serviceInvoice.ServiceInvoicePeriods.Sort((x, y) => + { + if (x.Customer != null && y.Customer != null) + return x.Customer.ToString().CompareTo(y.Customer.ToString()); + else if (x.Start != null && y.Start != null) + { + x.Start.Value.CompareTo(y.Start.Value); + } + return 0; + }); + } + } + + public Settlement2DC GetSettlementByInvoiceBaseOid(long invoiceBaseOid) + { + try + { + return MapperFactory.SettlementDC_SettlementInvoice.MapToNewDC(DAOFactory.SearchDAO.GetSettlementInvoiceByInvoiceBaseOid(invoiceBaseOid)); + } + catch (Exception e) + { + throw Utils.CreateBeWoFaultException(e); + } + } + + public List GetSettlementInvoicesForCostBearerAndPeriod(long costBearerOid, DateTime periodStart, DateTime periodEnd) + { + try + { + return MapperFactory.SettlementDC_SettlementInvoice.MapToNewDCs(DAOFactory.SearchDAO.GetSettlementInvoicesForCostBearerAndPeriod(costBearerOid, periodStart, periodEnd)); + } + catch (Exception e) + { + throw Utils.CreateBeWoFaultException(e); + } + } + + public List GetSettlementInvoicesForSupportConcept(long supportConceptOid) + { + try + { + return MapperFactory.SettlementDC_SettlementInvoice.MapToNewDCs(DAOFactory.SearchDAO.GetSettlementInvoiceBySupportConceptOid(supportConceptOid)); + } + catch (Exception e) + { + throw Utils.CreateBeWoFaultException(e); + } + } + + public List InsertNewInvoiceBases(List invoices) + { + try + { + if (invoices != null && LoggedInUserOperationContextExt.Current != null && + LoggedInUserOperationContextExt.Current.User != null) + { + var loggedInUser = LoggedInUserOperationContextExt.Current.User; + + foreach (var ib in invoices) + { + ib.SenderContactInformations = new List(); + + + foreach (var contact in loggedInUser.Employee.Person.Contacts) + { + var newContact = new ContactDC(); + newContact.ContactType = contact.Type; + newContact.ContactValue = contact.Value; + + ib.SenderContactInformations.Add(newContact); + } + } + + + } + + var newInvoices = MapperFactory.InvoiceBaseDC_InvoiceBase.MapToNewEntities(invoices); + int count = 0; + + var inc = PluginLoader.FindClass(); + + foreach (var ib in newInvoices) + { + if (ib.Type == InvoiceType.General) + { + foreach (var item in ib.InvoiceItems) + { + item.AmountTotal = Math.Round(item.AmountTotal ?? 0, 2, MidpointRounding.AwayFromZero); + } + } + var nextNumber = inc.GetNextInvoiceNumber(count, ib); + if (!String.IsNullOrEmpty(nextNumber)) + { + if (!String.IsNullOrEmpty(ib.InvoiceNumber)) // Rechnungsnummer schon vorher erzeugt oder per Hand vergeben. + { + if (ib.InvoiceNumber == nextNumber) + //Die per Hand vergebene Rechnungsnummer ist gleich der nächsten berechneten Rechnungsnummer, daher Rechnungsnummerzähler erhöhen + { + count++; + } + } + else + { + ib.InvoiceNumber = nextNumber; + count++; + } + } + } + + var factory = PluginLoader.FindClass(); + + if (factory != null) + { + foreach (var ib in newInvoices) + { + if (ib.Type == InvoiceType.CustomerEquity) + { + var creator = factory.CreateEquityInvoiceCreator(ib); + creator.InitEquityInvoice(ib); + } + else if (ib.Type == InvoiceType.General) + { + var creator = factory.CreateGeneralInvoiceCreator(ib); + creator.InitInvoice(ib); + } + } + + + } + + + + DAOFactory.GenericDAO.Insert(newInvoices); + + inc.IncreaseInvoiceNumber(count, newInvoices); + + return newInvoices.Select(i => i.Oid.Value).ToList(); + } + catch (Exception e) + { + throw Utils.CreateBeWoFaultException(e); + } + } + + public List InsertNewServiceInvoices(List invoices) + { + try + { + //Prüfe Flags + var neueRechnungen = new List(); + var diffRechnungen = invoices.Where(i => i.InvoiceBase.DiffErstellen).ToList(); + + //Bei neuer Rechung prüfen, ob eine Diff Rechnung vorher generiert wurde. + foreach (var item in invoices.Where(i => i.InvoiceBase.NeuErstellen)) + { + if (item.OriginalZurDifferenz != null) + { + neueRechnungen.Add(item.OriginalZurDifferenz); + } + else + { + neueRechnungen.Add(item); + } + } + + var newInvoices = MapperFactory.ServiceInvoiceDC_ServiceInvoice.MapToNewEntities(neueRechnungen); + newInvoices.AddRange(MapperFactory.ServiceInvoiceDC_ServiceInvoice.MapToNewEntities(diffRechnungen)); + if (newInvoices.Count > 0) + { + int count = 0; + var inc = PluginLoader.FindClass(); + + foreach (var i in newInvoices) + { + var nextNumber = inc.GetNextInvoiceNumber(count, i.InvoiceBase); + if (!String.IsNullOrEmpty(nextNumber)) + { + //if (!String.IsNullOrEmpty(i.InvoiceBase.InvoiceNumber) && newInvoices.Count == 1) + // // Rechnungsnummer schon vorher erzeugt oder per Hand vergeben. + //{ + // if (i.InvoiceBase.InvoiceNumber == nextNumber || newInvoices.Count > 1) + // //Die per Hand vergebene Rechnungsnummer ist gleich der nächsten berechneten Rechnungsnummer, daher Rechnungsnummerzähler erhöhen + // { + // count++; + // } + //} + //else + //{ + i.InvoiceBase.InvoiceNumber = nextNumber; + count++; + //} + } + } + + DAOFactory.GenericDAO.Insert(newInvoices); + + inc.IncreaseInvoiceNumberForServiceInvoices(count, newInvoices); + } + return newInvoices.Select(i => i.Oid.Value).ToList(); + } + catch (Exception e) + { + throw Utils.CreateBeWoFaultException(e); + } + } + + + public List InsertNewSettlementInvoice(List invoices) + { + try + { + + var newInvoices = MapperFactory.SettlementDC_SettlementInvoice.MapToNewEntities(invoices); + int count = 0; + var inc = PluginLoader.FindClass(); + + foreach (var i in newInvoices) + { + var nextNumber = inc.GetNextInvoiceNumber(count, i.InvoiceBase); + if (!String.IsNullOrEmpty(nextNumber)) + { + if (!String.IsNullOrEmpty(i.InvoiceBase.InvoiceNumber)) // Rechnungsnummer schon vorher erzeugt oder per Hand vergeben. + { + if (i.InvoiceBase.InvoiceNumber == nextNumber) + //Die per Hand vergebene Rechnungsnummer ist gleich der nächsten berechneten Rechnungsnummer, daher Rechnungsnummerzähler erhöhen + { + count++; + } + } + else + { + i.InvoiceBase.InvoiceNumber = nextNumber; + count++; + } + } + } + + DAOFactory.GenericDAO.Insert(newInvoices); + + inc.IncreaseInvoiceNumber(count, newInvoices); + return newInvoices.Select(i => i.Oid.Value).ToList(); + } + catch (Exception e) + { + throw Utils.CreateBeWoFaultException(e); + } + } + + public InvoiceBaseDC LoadInvoiceBaseByOid(long invoiceBaseOid) + { + try + { + var r = MapperFactory.InvoiceBaseDC_InvoiceBase.MapToNewDC( + DAOFactory.GenericDAO.LoadByID(invoiceBaseOid)); + + if (r.Type == InvoiceType.Settlement && r.SupportConceptOid != null) + { + SupportConcept sc = DAOFactory.GenericDAO.LoadByID(r.SupportConceptOid.Value); + r.CustomerFirstName = sc.Customer.Person.FirstName; + r.CustomerLastName = sc.Customer.Person.LastName; + + } + + return r; + } + catch (Exception e) + { + throw Utils.CreateBeWoFaultException(e); + } + } + + public InvoiceNumberDC LoadInvoiceNumber() + { + try + { + var inr = DAOFactory.GenericDAO.LoadByID(1); + if (inr != null) + return MapperFactory.InvoiceNumberDC_InvoiceNumber.MapToNewDC(inr); + return null; + } + catch (Exception e) + { + throw Utils.CreateBeWoFaultException(e); + } + } + + public ServiceInvoiceDC LoadServiceInvoiceByOid(long serviceInvoiceOid) + { + try + { + var r = MapperFactory.ServiceInvoiceDC_ServiceInvoice.MapToNewDC(DAOFactory.GenericDAO.LoadByID(serviceInvoiceOid)); + + return r; + } + catch (Exception e) + { + throw Utils.CreateBeWoFaultException(e); + } + } + + public List UpdateInvoiceBases(List invoices) + { + try + { + var originals = DAOFactory.GenericDAO.LoadByIDs(invoices.Select(i => i.InvoiceBaseOid.Value)); + bool macheMerge = true; + foreach (var entity in originals) + { + var dc = invoices.Where(i => i.InvoiceBaseOid == entity.Oid).FirstOrDefault(); + + + if (dc.IsPaid != entity.IsPaid || + dc.IsExported != entity.IsExported || + dc.IsReviewed != entity.IsReviewed || + dc.IsSent != entity.IsSent || + dc.PartialPayment != entity.PartialPayment) + { + //Kann nur über die Rechnungsübersicht geändert werden, daher kein Merge mit dem dc machen! + entity.IsPaid = dc.IsPaid; + entity.IsExported = dc.IsExported; + entity.IsReviewed = dc.IsReviewed; + entity.IsSent = dc.IsSent; + entity.PartialPayment = dc.PartialPayment; + macheMerge = false; + DAOFactory.GenericDAO.Update(entity); + } + } + + if (macheMerge) + { + MapperFactory.InvoiceBaseDC_InvoiceBase.MergeWithEntitys(invoices, originals); + DAOFactory.GenericDAO.Update(originals); + } + return originals.Select(e => e.Version.Value).ToList(); + } + catch (Exception e) + { + throw Utils.CreateBeWoFaultException(e); + } + } + + public List SetInvoicePaid(List invoices, bool isPaid) + { + try + { + var originals = DAOFactory.GenericDAO.LoadByIDs(invoices.Select(i => i.InvoiceBaseOid.Value)); + foreach (var invoiceBase in originals) + { + invoiceBase.IsPaid = isPaid; + } + DAOFactory.GenericDAO.Update(originals); + return originals.Select(e => e.Version.Value).ToList(); + } + catch (Exception e) + { + throw Utils.CreateBeWoFaultException(e); + } + } + + public InvoiceNumberDC UpdateInvoiceNumber(InvoiceNumberDC dc) + { + try + { + + var old = DAOFactory.GenericDAO.LoadByID(1); + MapperFactory.InvoiceNumberDC_InvoiceNumber.MergeWithEntity(dc, old); + DAOFactory.GenericDAO.Update(old); + + return MapperFactory.InvoiceNumberDC_InvoiceNumber.MapToNewDC(old); + } + catch (Exception e) + { + throw Utils.CreateBeWoFaultException(e); + } + } + + public List UpdateServiceInvoices(List invoices) + { + var acc = PluginLoader.FindClass(); + return acc.UpdateServiceInvoices(invoices); + } + + public void UpdateSettlementInvoice(List invoices) + { + try + { + var originals = DAOFactory.GenericDAO.LoadByIDs(invoices.Select(i => i.SettlementIvoiceOid.Value)); + MapperFactory.SettlementDC_SettlementInvoice.MergeWithEntitys(invoices, originals); + + //originals.ForEach( + // i => + // { + //i.InvoiceBase.Type = InvoiceType.Settlement; + + // We´ll add an invoiceitem, so we can treat a settlement like any other invoice + //i.InvoiceBase.InvoiceItems.Clear(); + //i.InvoiceBase.InvoiceItems.Add( + // new InvoiceItem + // { + // AmountTotal = i.Claim, + // ItemPeriodStart = i.InvoiceBase.AccountingPeriodStart, + // ItemPeriodEnd = i.InvoiceBase.AccountingPeriodEnd, + // ItemDescription = "Spitzabrechung" + // }); + //}); + DAOFactory.GenericDAO.Update(originals); + } + catch (Exception e) + { + throw Utils.CreateBeWoFaultException(e); + } + } + + + public List LoadInvoiceNumberList() + { + try + { + var numbers = DAOFactory.GenericDAO.GetAllActive(); + + return MapperFactory.InvoiceNumberDC_InvoiceNumber.MapToNewDCs(numbers); + + } + catch (Exception e) + { + throw Utils.CreateBeWoFaultException(e); + } + } + + public List UpdateInvoiceNumberList(List dclist) + { + try + { + var numbers = DAOFactory.GenericDAO.GetAllActive(); + + MapperFactory.InvoiceNumberDC_InvoiceNumber.MergeWithEntitys(dclist, numbers); + DAOFactory.GenericDAO.Update(numbers); + + return MapperFactory.InvoiceNumberDC_InvoiceNumber.MapToNewDCs(numbers); + } + catch (Exception e) + { + 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; + + var entities = DAOFactory.SearchDAO.GetGkvAbrechnungen(start, end, filter); + + return MapperFactory.GkvAbrechnungDC_GkvAbrechnung.MapToNewDCs(entities); + } + catch (Exception e) + { + throw Utils.CreateBeWoFaultException(e); + } + } + public List GetAllGkvAbrechnungen() + { + try + { + var user = LoggedInUserOperationContextExt.Current?.User ?? SessionFacade.LoggedInUser; + + var entries = DAOFactory.GenericDAO.GetAllActive(); + + var dcs = MapperFactory.GkvAbrechnungDC_GkvAbrechnung.MapToNewDCs(entries); + + var updateables = dcs.Where(x => x.IsWaiting()).ToArray(); + + if (!updateables.Any()) + return dcs; + + var isUpToDate = SendApp8GetStatusRequest(updateables); + + if (isUpToDate) + return dcs; + + entries = DAOFactory.GenericDAO.GetAllActive(); + + dcs = MapperFactory.GkvAbrechnungDC_GkvAbrechnung.MapToNewDCs(entries); + + return dcs; + } + catch (Exception e) + { + throw Utils.CreateBeWoFaultException(e); + } + } + + public GkvAbrechnungResponseDC CreateNewGkvAbrechnung(GkvAbrechnungRequestDC request) + { + var response = new GkvAbrechnungResponseDC(); + + try + { + 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.GetOrganisation(); + + gkv_abrechnung.Verfahrensstufe = orga.Verfahrensstufe; + + decimal gesamt = 0; + foreach (var invoicebase_oid in request.SelectedInvoiceBases) + { + var service = DAOFactory.SearchDAO.GetServiceInvoiceByInvoiceBaseOid(invoicebase_oid); + var invoicebase = DAOFactory.GenericDAO.GetByID(invoicebase_oid); + + var invoicebase_dc = MapperFactory.InvoiceBaseDC_InvoiceBase.MapToNewDC(invoicebase); + + 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; + + return response; + } + catch (DakotaException exc) + { + response.Error = exc.Message; + } + catch (Exception e) + { + 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); - DAOFactory.GenericDAO.Update(entity); + 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); - } - } + 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(); - - response.Successful = false; - - var oid = req.GkvAbrechnungOid; - - var entity = DAOFactory.GenericDAO.LoadByID(oid); + public GkvAbrechnungSendResponseDC SendNewGkvAbrechnung(GkvAbrechnungSendRequestDC req) + { + var response = new GkvAbrechnungSendResponseDC(); + + response.Successful = false; + + var oid = req.GkvAbrechnungOid; + + var entity = DAOFactory.GenericDAO.LoadByID(oid); - var state = GkvAbrechnung.GetState(entity); + var state = GkvAbrechnung.GetState(entity); - if (state == GkvState.Waiting || state == GkvState.OldAndNoFeedback || state == GkvState.Paid) - { - response.Message = "Validierung fehlgeschlagen"; - return response; - } + if (state == GkvState.Waiting || state == GkvState.OldAndNoFeedback || state == GkvState.Paid) + { + response.Message = "Validierung fehlgeschlagen"; + return response; + } - var protokoll = new GkvTransferProtokoll(); + var protokoll = new GkvTransferProtokoll(); - protokoll.ErstelltAm = DateTime.Now; - protokoll.GkvAbrechnungOid = entity.Oid.Value; + protokoll.ErstelltAm = DateTime.Now; + protokoll.GkvAbrechnungOid = entity.Oid.Value; - try - { - CreateGkvTransferProtokoll(oid, entity, protokoll); + try + { + CreateGkvTransferProtokoll(oid, entity, protokoll); - if (entity.GkvTransferProtokolle is null) - entity.GkvTransferProtokolle = new List(); + if (entity.GkvTransferProtokolle is null) + entity.GkvTransferProtokolle = new List(); - entity.GkvTransferProtokolle.Add(protokoll); + entity.GkvTransferProtokolle.Add(protokoll); - // Protokoll braucht Oid - DAOFactory.GenericDAO.Update(entity); + // Protokoll braucht Oid + DAOFactory.GenericDAO.Update(entity); - var app8_response = SendApp8SendNewRequest(protokoll); + var app8_response = SendApp8SendNewRequest(protokoll); - var app8_protokoll = app8_response.GkvTransferProtokollDC; + var app8_protokoll = app8_response.GkvTransferProtokollDC; - MapperFactory.GkvTransferProtokollDC_GkvTransferprotokoll.MergeWithEntity(app8_protokoll, protokoll); + MapperFactory.GkvTransferProtokollDC_GkvTransferprotokoll.MergeWithEntity(app8_protokoll, protokoll); - response.Successful = app8_response.Success; - } - catch (DakotaException de) - { - protokoll.Fehlerdatum = DateTime.Now; - protokoll.Fehlerlevel = GkvTransferFehlerlevel.Soft; - protokoll.Fehlernachricht = de.Message; - protokoll.Fehlertitel = de.Title ?? "Default"; - } - catch (Exception e) - { - protokoll.Fehlerdatum = DateTime.Now; - protokoll.Fehlerlevel = GkvTransferFehlerlevel.Fatal; - 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); + response.Successful = app8_response.Success; + } + catch (DakotaException de) + { + protokoll.Fehlerdatum = DateTime.Now; + protokoll.Fehlerlevel = GkvTransferFehlerlevel.Soft; + protokoll.Fehlernachricht = de.Message; + protokoll.Fehlertitel = de.Title ?? "Default"; + } + catch (Exception e) + { + protokoll.Fehlerdatum = DateTime.Now; + protokoll.Fehlerlevel = GkvTransferFehlerlevel.Fatal; + 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; - } - private void CreateGkvTransferProtokoll(long oid, GkvAbrechnung gkvAbrechnung, GkvTransferProtokoll protokoll) - { - try - { - var manager = new DakotaManager(); - var mandatordc = new OperationsServiceImp().GetMandator(); + return response; + } + private void CreateGkvTransferProtokoll(long oid, GkvAbrechnung gkvAbrechnung, GkvTransferProtokoll protokoll) + { + try + { + var manager = new DakotaManager(); + var mandatordc = new OperationsServiceImp().GetMandator(); - DakotaValidator.ValidateMandator(mandatordc); + DakotaUtils.ValidateMandator(mandatordc); - var orga = gkvAbrechnung.GetOrganisation(); + var orga = gkvAbrechnung.GetOrganisation(); - DakotaValidator.ValidateOrganisation(orga); - - if (!DakotaValidator.ValidateOrganisationInformations(orga)) - { - var res = SendApp8GetIKRequest(orga); - - if (!res.Success) - throw new DakotaException(res.Message, "Interner Fehler"); - - if (!res.Gefunden) - throw new DakotaException($"Für die Organisation \"{orga.Name}\" mit dem IK \"{orga.IKKrankenkasse}\" konnte keine Datenannahmestelle gefunden werden. " + - $"Bitte informieren Sie sich bei der Krankenkasse, ob zum elektronischen Datenaustausch " + - $"eine seperate Anmeldung benötigt wird."); + DakotaUtils.ValidateOrganisation(orga); + + if (!DakotaValidator.ValidateOrganisationInformations(orga.IKDatenannahmestelle, orga.IKKostentrager, orga.IKKrankenkasse, orga.BezDatenannahmestelle)) + { + var res = SendApp8GetIKRequest(orga); + + if (!res.Success) + throw new DakotaException(res.Message, "Interner Fehler"); + + if (!res.Gefunden) + throw new DakotaException($"Für die Organisation \"{orga.Name}\" mit dem IK \"{orga.IKKrankenkasse}\" konnte keine Datenannahmestelle gefunden werden. " + + $"Bitte informieren Sie sich bei der Krankenkasse, ob zum elektronischen Datenaustausch " + + $"eine seperate Anmeldung benötigt wird."); - orga.IKDatenannahmestelle = res.IKDatenannahmestelle; - orga.IKKostentrager = res.IKKostentrager; - orga.BezDatenannahmestelle = res.BezDatenannahmestelle; + orga.IKDatenannahmestelle = res.IKDatenannahmestelle; + orga.IKKostentrager = res.IKKostentrager; + orga.BezDatenannahmestelle = res.BezDatenannahmestelle; - if (!DakotaValidator.ValidateOrganisationInformations(orga)) - throw new DakotaException($"Für die Organisation \"{orga.Name}\" konnten die hinterlegten IKs nicht verifiziert werden: \"{orga.BezDatenannahmestelle}\", \"{orga.IKDatenannahmestelle}\", \"{orga.IKKostentrager}\", \"{orga.IKKrankenkasse}\"", "Interner Fehler"); + if (!DakotaValidator.ValidateOrganisationInformations(orga.IKDatenannahmestelle, orga.IKKostentrager, orga.IKKrankenkasse, orga.BezDatenannahmestelle)) + throw new DakotaException($"Für die Organisation \"{orga.Name}\" konnten die hinterlegten IKs nicht verifiziert werden: \"{orga.BezDatenannahmestelle}\", \"{orga.IKDatenannahmestelle}\", \"{orga.IKKostentrager}\", \"{orga.IKKrankenkasse}\"", "Interner Fehler"); - DAOFactory.GenericDAO.Update(orga); + DAOFactory.GenericDAO.Update(orga); - gkvAbrechnung = DAOFactory.GenericDAO.LoadByID(oid); - } + gkvAbrechnung = DAOFactory.GenericDAO.LoadByID(oid); + } - var gkvAbrechnungDC = MapperFactory.GkvAbrechnungDC_GkvAbrechnung.MapToNewDC(gkvAbrechnung); - var orgadc = gkvAbrechnungDC.Organisation; - - var datenannahmestelle = orgadc.IKDatenannahmestelle; - var (datenaustauschreferenz, transfernummer) = GetNextDatenaustauschreferenzTransfernummer(gkvAbrechnung, datenannahmestelle); - var (dat_short, tra_short) = ClearDatenaustauschreferenzTransfernummer(datenaustauschreferenz, transfernummer); - - protokoll.Datenaustauschreferenz = datenaustauschreferenz; - protokoll.Transfernummer = transfernummer; - - 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); - - DakotaValidator.ValidateCustomer(customerdc); - - manager.Add(servicedc, orgadc, customerdc, mandatordc, dat_short, tra_short); - } - - manager.Apply(); - - if (manager.DakotaFileDict.Count != 1 || manager.DakotaFileDict.First().Value.GetKostenträgerCount() != 1) - { - throw new DakotaException("Unerwartete Anzahl an Dakota Files berechnet."); - } - - 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 65,535 (2^16 − 1) characters. - // The effective maximum length is less if the value contains multibyte - // characters. Each TEXT value is stored using a 2-byte length prefix - // that indicates the number of bytes in the value. - if (nutzdatendatei.Length > 65535) - { - throw new DakotaException($"nutzdatendatei - Länger als 65535: {nutzdatendatei.Length}"); - } - - 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 = orga.BezDatenannahmestelle; - } - catch (DakotaException de) - { - if (string.IsNullOrEmpty(de.Title)) - de.Title = "Protokoll Erstellung"; - - throw de; - } - catch (Exception e) - { - throw new DakotaException(e.Message, "Erstellung"); - } - } - - private Tuple GetNextDatenaustauschreferenzTransfernummer(GkvAbrechnung gkvAbrechnung, string datenannahmestelle) - { - var datenaustauschref = DAOFactory.SearchDAO.GetNextDatenaustauschreferenz(datenannahmestelle); - int transfernummer; - - var state = GkvAbrechnung.GetState(gkvAbrechnung); - - if (state == GkvState.NoSend) - { - transfernummer = DAOFactory.SearchDAO.GetNextTransfernummer(datenannahmestelle); - } - else if (state == GkvState.Error || state == GkvState.ErrorFatal) - { - transfernummer = gkvAbrechnung.GkvTransferProtokolle.Last().Transfernummer; - } - else - { - throw new ArgumentException("Versucht Datenaustauschref zu laden, invalid 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 GkvApp8SendNewResponse SendApp8SendNewRequest(GkvTransferProtokoll protokoll) - { - var gkv_transfer_dc = MapperFactory.GkvTransferProtokollDC_GkvTransferprotokoll.MapToNewDC(protokoll); - - var url = "https://app8.bewoplaner.de/service/GkvAbrechnungView.aspx"; + var gkvAbrechnungDC = MapperFactory.GkvAbrechnungDC_GkvAbrechnung.MapToNewDC(gkvAbrechnung); + var orgadc = gkvAbrechnungDC.Organisation; + + var datenannahmestelle = orgadc.IKDatenannahmestelle; + var (datenaustauschreferenz, transfernummer) = GetNextDatenaustauschreferenzTransfernummer(gkvAbrechnung, datenannahmestelle); + var (dat_short, tra_short) = ClearDatenaustauschreferenzTransfernummer(datenaustauschreferenz, transfernummer); + + protokoll.Datenaustauschreferenz = datenaustauschreferenz; + protokoll.Transfernummer = transfernummer; + + 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); + + DakotaUtils.ValidateCustomer(customerdc); + + manager.Add(servicedc, orgadc, customerdc, mandatordc, dat_short, tra_short); + } + + manager.Apply(); + + if (manager.DakotaFileDict.Count != 1 || manager.DakotaFileDict.First().Value.GetKostenträgerCount() != 1) + { + throw new DakotaException("Unerwartete Anzahl an Dakota Files berechnet."); + } + + 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 65,535 (2^16 − 1) characters. + // The effective maximum length is less if the value contains multibyte + // characters. Each TEXT value is stored using a 2-byte length prefix + // that indicates the number of bytes in the value. + if (nutzdatendatei.Length > 65535) + { + throw new DakotaException($"nutzdatendatei - Länger als 65535: {nutzdatendatei.Length}"); + } + + 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 = orga.BezDatenannahmestelle; + } + catch (DakotaException de) + { + if (string.IsNullOrEmpty(de.Title)) + de.Title = "Protokoll Erstellung"; + + throw de; + } + catch (Exception e) + { + throw new DakotaException(e.Message, "Erstellung"); + } + } + + private Tuple GetNextDatenaustauschreferenzTransfernummer(GkvAbrechnung gkvAbrechnung, string datenannahmestelle) + { + var datenaustauschref = DAOFactory.SearchDAO.GetNextDatenaustauschreferenz(datenannahmestelle); + int transfernummer; + + var state = GkvAbrechnung.GetState(gkvAbrechnung); + + if (state == GkvState.NoSend) + { + transfernummer = DAOFactory.SearchDAO.GetNextTransfernummer(datenannahmestelle); + } + else if (state == GkvState.Error || state == GkvState.ErrorFatal) + { + transfernummer = gkvAbrechnung.GkvTransferProtokolle.Last().Transfernummer; + } + else + { + throw new ArgumentException("Versucht Datenaustauschref zu laden, invalid 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 GkvApp8SendNewResponse SendApp8SendNewRequest(GkvTransferProtokoll protokoll) + { + var gkv_transfer_dc = MapperFactory.GkvTransferProtokollDC_GkvTransferprotokoll.MapToNewDC(protokoll); + + var request_app8 = new GkvApp8SendNewRequest + { + SendDirect = true, + GkvTransferProtokoll = gkv_transfer_dc + }; #if DEBUG - //url = "http://localhost:3777/Host/GkvAbrechnungView.aspx"; + request_app8.SendDirect = false; #endif - var request_app8 = new GkvApp8SendNewRequest - { - SendDirect = true, - GkvTransferProtokoll = gkv_transfer_dc - }; + var response_app8 = SendApp8Request(request_app8); + + if (!response_app8.Success) + throw new DakotaException(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 GkvApp8GetStatusRequest + { + Tenant = MultitenancyOperationContextExt.Current.Tenant, + Oids = new long[updateables_len], + DebugMode = "fozc4897b6ztvf978AFCRRG244fvFV2532fvf324AF", + }; + + 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; + } + + GkvApp8GetStatusResponse response_app8; + try + { + response_app8 = SendApp8Request(request); + } + catch (Exception e) + { + return true; + } + + if (!response_app8.Success) + throw new DakotaException(response_app8.Message); + + bool allAreUpToDate = true; + for (int id = 0; id < updateables_len; id++) + { + var gkv_abrechnung = updateables[id]; + var fehler = response_app8.Fehler[id]; + + if (fehler is null) + continue; + + allAreUpToDate = false; + + var gkv_abrechnung_entity = DAOFactory.GenericDAO.LoadByID(gkv_abrechnung.GkvAbrechnungOid.Value); + + var protokoll = gkv_abrechnung_entity.GkvTransferProtokolle.First(x => x.Oid == fehler.Oid); + + protokoll.Fehlerdatum = fehler.Datum; + protokoll.Fehlerlevel = fehler.Level; + protokoll.Fehlernachricht = fehler.Nachricht; + protokoll.Fehlertitel = fehler.Titel; + + DAOFactory.GenericDAO.Update(gkv_abrechnung_entity); + } + + return allAreUpToDate; + } + + public GkvApp8GetIKResponse SendApp8GetIKRequest(GkvApp8GetIKRequest req) + { + try + { + req.Abrechnungscode = DakotaUtils.GetAbrechnungscode(req.Leistungserbringergruppe); + req.Tarifkennzeichen = DakotaUtils.GetTarifkennzeichen(req.Leistungserbringergruppe); + + return SendApp8Request(req); + } + catch (Exception e) + { + throw Utils.CreateBeWoFaultException(e); + } + } + + private GkvApp8GetIKResponse SendApp8GetIKRequest(Organisation orga) + { + var gruppe = orga.Leistungserbringergruppe; + var abr = DakotaUtils.GetAbrechnungscode(gruppe); + var tarif = DakotaUtils.GetTarifkennzeichen(gruppe); + + var request = new GkvApp8GetIKRequest + { + Abrechnungscode = abr, + IKKrankenkasse = orga.IKKrankenkasse, + Tarifkennzeichen = tarif + }; + + return SendApp8Request(request); + } + + private T2 SendApp8Request(T request, string url = null) where T : GkvApp8Request where T2 : GkvApp8Response + { + if (url == null) + { + url = "https://app8.bewoplaner.de/service/GkvAbrechnungView.aspx"; +#if DEBUG + url = "http://localhost:3777/Host/GkvAbrechnungView.aspx"; +#endif + } + + var user = LoggedInUserOperationContextExt.Current?.User ?? SessionFacade.LoggedInUser; + if (user == null) + { + throw new DakotaException("User unbekannt", "KApp"); + } + + request.Username = user.LoginName; + request.Password = user.BCryptPassword; + request.Tenant = MultitenancyOperationContextExt.Current.Tenant; #if DEBUG - request_app8.SendDirect = false; + request.DebugMode = "fozc4897b6ztvf978AFCRRG244fvFV2532fvf324AF"; #endif - var response_app8 = SendApp8Request(url, request_app8); + return JsonConvert.DeserializeObject(SendApp8Request(url, JsonConvert.SerializeObject(request))); + } + private string SendApp8Request(string url, string dataString) + { + string response_app8_str; - if (!response_app8.Success) - throw new DakotaException(response_app8.Message); + try + { + url += "?tenant=" + MultitenancyOperationContextExt.Current.Tenant; - 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(); + using (WebClient client = new WebClient()) + { + client.Headers.Add(HttpRequestHeader.ContentType, "application/json"); - var url = "https://app8.bewoplaner.de/service/GkvAbrechnungView.aspx"; + response_app8_str = client.UploadString(url, "POST", dataString); + } + } + catch (Exception e) + { + throw new DakotaException(e.Message, "App8"); + } - var request = new GkvApp8GetStatusRequest - { - Tenant = MultitenancyOperationContextExt.Current.Tenant, - Oids = new long[updateables_len], - DebugMode = "fozc4897b6ztvf978AFCRRG244fvFV2532fvf324AF", - }; + if (string.IsNullOrEmpty(response_app8_str)) + throw new DakotaException("Leere Antwort", "App8"); - for (int id = 0; id < updateables_len; id++) - { - var gkv_abrechnung = updateables[id]; - var gkv_transfer = gkv_abrechnung.TransferProtokolle.Last(); + return response_app8_str; + } - request.Oids[id] = gkv_transfer.GkvTransferProtokollOid.Value; - } - - GkvApp8GetStatusResponse response_app8; - try - { - response_app8 = SendApp8Request(url, request); - } - catch (Exception e) - { - return true; - } - - if (!response_app8.Success) - throw new DakotaException(response_app8.Message); - - bool allAreUpToDate = true; - for (int id = 0; id < updateables_len; id++) - { - var gkv_abrechnung = updateables[id]; - var fehler = response_app8.Fehler[id]; - - if (fehler is null) - continue; - - allAreUpToDate = false; - - var gkv_abrechnung_entity = DAOFactory.GenericDAO.LoadByID(gkv_abrechnung.GkvAbrechnungOid.Value); - - var protokoll = gkv_abrechnung_entity.GkvTransferProtokolle.First(x => x.Oid == fehler.Oid); - - protokoll.Fehlerdatum = fehler.Datum; - protokoll.Fehlerlevel = fehler.Level; - protokoll.Fehlernachricht = fehler.Nachricht; - protokoll.Fehlertitel = fehler.Titel; - - DAOFactory.GenericDAO.Update(gkv_abrechnung_entity); - } - - return allAreUpToDate; - } - - private GkvApp8GetIKResponse SendApp8GetIKRequest(Organisation orga) - { - var gruppe = orga.Leistungserbringergruppe; - var abr = DakotaUtils.GetAbrechnungscode(gruppe); - var tarif = DakotaUtils.GetTarifkennzeichen(gruppe); - - var url = "https://app8.bewoplaner.de/service/GkvAbrechnungView.aspx"; - - var request = new GkvApp8GetIKRequest - { - Abrechnungscode = abr, - IKKrankenkasse = orga.IKKrankenkasse, - Tarifkennzeichen = tarif - }; - - return SendApp8Request(url, request); - } - - private T2 SendApp8Request(string url, T request) where T : GkvApp8Request where T2 : GkvApp8Response - { - var user = LoggedInUserOperationContextExt.Current?.User ?? SessionFacade.LoggedInUser; - if (user == null) - { - throw new DakotaException("User unbekannt", "KApp"); - } - - request.Username = user.LoginName; - request.Password = user.BCryptPassword; - request.DebugMode = "fozc4897b6ztvf978AFCRRG244fvFV2532fvf324AF"; - request.Tenant = MultitenancyOperationContextExt.Current.Tenant; - - return JsonConvert.DeserializeObject(SendApp8Request(url, JsonConvert.SerializeObject(request))); - } - private string SendApp8Request(string url, string dataString) - { - string response_app8_str; - - try - { - url += "?tenant=" + MultitenancyOperationContextExt.Current.Tenant; - - using (WebClient client = new WebClient()) - { - client.Headers.Add(HttpRequestHeader.ContentType, "application/json"); - - response_app8_str = client.UploadString(url, "POST", dataString); - } - } - catch (Exception e) - { - throw new DakotaException(e.Message, "App8"); - } - - if (string.IsNullOrEmpty(response_app8_str)) - throw new DakotaException("Leere Antwort", "App8"); - - return response_app8_str; - } - - #endregion - } + #endregion + } } \ No newline at end of file diff --git a/Shared/Core/DakotaValidator.cs b/Shared/Core/DakotaValidator.cs new file mode 100644 index 000000000..cbde77d41 --- /dev/null +++ b/Shared/Core/DakotaValidator.cs @@ -0,0 +1,53 @@ +using BS.Shared.DataContracts; +using BS.Shared.DataContracts.GkvAbrechnung; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace BS.Shared.Core +{ + public static class DakotaValidator + { + public static bool ValidateMandator(string ik_leistungserbringer) + => ValidateIKNumber(ik_leistungserbringer); + public static bool ValidateOrganisationInformations(string ik_datenannahmestelle, string ik_kostentrager, string ik_krankenkasse, string bez_datenannahmestelle) + => ValidateIKNumber(ik_datenannahmestelle, ik_kostentrager, ik_krankenkasse) && !string.IsNullOrEmpty(bez_datenannahmestelle); + public static bool ValidateIKNumber(params string[] iks) + => iks?.All(ValidateIKNumber) ?? false; + + public static bool ValidateIKNumber(string iknummer) + { + if (iknummer == null) + return false; + + if (iknummer.Length != 9) + return false; + + return int.TryParse(iknummer, out int x); + } + + public static bool ValidateVersichertenstatus(string status) + { + if (status == null) + return false; + + if (status.Length != 5 && status.Length != 7) + return false; + + return true; + } + + public static bool ValidateLeistungserbringergruppe(string code) + { + if (code == null) + return false; + + if (code.Length != 5 && code.Length != 7) + return false; + + return true; + } + } +} diff --git a/Shared/DataContracts/GkvAbrechnung/GkvApp8GetIKRequest.cs b/Shared/DataContracts/GkvAbrechnung/GkvApp8GetIKRequest.cs index 751c81fd4..f155a078f 100644 --- a/Shared/DataContracts/GkvAbrechnung/GkvApp8GetIKRequest.cs +++ b/Shared/DataContracts/GkvAbrechnung/GkvApp8GetIKRequest.cs @@ -18,6 +18,9 @@ namespace BS.Shared.DataContracts.GkvAbrechnung [DataMember] public string Tarifkennzeichen { get; set; } + [DataMember] + public string Leistungserbringergruppe { get; set; } + public GkvApp8GetIKRequest() { Type = GkvAbrechnungApp8RequestTypeDC.GetIKNumber; diff --git a/Shared/Shared.csproj b/Shared/Shared.csproj index 81c037dc9..95a22618f 100644 --- a/Shared/Shared.csproj +++ b/Shared/Shared.csproj @@ -134,6 +134,7 @@ + From b8a688784be53e0f130aeb2210aa0cb6d462b388 Mon Sep 17 00:00:00 2001 From: Rene Evertz Date: Thu, 17 Oct 2024 14:21:29 +0200 Subject: [PATCH 02/46] Bezahl Flag wird nach unten durchgereicht --- BeWo/BeWoApp.xaml.cs | 3 ++- .../Accounting/GkvAbrechnungOverview.xaml.cs | 25 ++++++++----------- BeWo/ViewModel/GkvAbrechnungVM.cs | 15 +++++++++++ .../AccountingServiceImp.cs | 5 ++++ 4 files changed, 33 insertions(+), 15 deletions(-) diff --git a/BeWo/BeWoApp.xaml.cs b/BeWo/BeWoApp.xaml.cs index 8b7e93e72..aedce1c02 100644 --- a/BeWo/BeWoApp.xaml.cs +++ b/BeWo/BeWoApp.xaml.cs @@ -526,7 +526,7 @@ namespace BeWo val = UserSettingsUtils.GetSettingValue(_Mandator.Settings, SettingsKeys.AllowGkvAbrechnung); AppSettings.AllowGkvAbrechnung = val != null && val.Equals("1"); - + val = UserSettingsUtils.GetSettingValue(_Mandator.Settings, SettingsKeys.ShowImportAbschlagszahlungen); AppSettings.ShowImportAbschlagszahlungen = val != null && val.Equals("1"); @@ -600,6 +600,7 @@ namespace BeWo AppSettings.ShowAI = true; AppSettings.ShowAIInternal = true; AppSettings.ShowWorktime = true; + //AppSettings.AllowGkvAbrechnung = true; //showInfoButtonInCalender = true; #endif diff --git a/BeWo/View/Detail/Accounting/GkvAbrechnungOverview.xaml.cs b/BeWo/View/Detail/Accounting/GkvAbrechnungOverview.xaml.cs index 7984bb7e3..79973056b 100644 --- a/BeWo/View/Detail/Accounting/GkvAbrechnungOverview.xaml.cs +++ b/BeWo/View/Detail/Accounting/GkvAbrechnungOverview.xaml.cs @@ -342,11 +342,10 @@ namespace BeWo.View.Detail.Accounting dc_in.Bezahlt = b; - ServiceFacade.DoAccountingServiceAsync(x => x.UpdateGkvAbrechnung(dc_in), cb => + ServiceFacade.DoAccountingServiceAsync(x => x.UpdateGkvAbrechnung(dc_in), dc_out => { Dispatcher.Invoke(() => { - vm.GkvAbrechnungVersion = cb.GkvAbrechnungVersion; - vm.Bezahlt = cb.Bezahlt; + vm.UpdateByDataContract(dc_out); }); }, false); } @@ -357,26 +356,24 @@ namespace BeWo.View.Detail.Accounting dc_in.UrbelegeGesendet = b; - ServiceFacade.DoAccountingServiceAsync(x => x.UpdateGkvAbrechnung(dc_in), cb => + ServiceFacade.DoAccountingServiceAsync(x => x.UpdateGkvAbrechnung(dc_in), dc_out => { Dispatcher.Invoke(() => { - vm.GkvAbrechnungVersion = cb.GkvAbrechnungVersion; - vm.UrbelegeGesendet = cb.UrbelegeGesendet; + vm.UpdateByDataContract(dc_out); }); }, false); - - //var dc = ServiceFacade.DoAccountingServiceSync(x => x.UpdateGkvAbrechnung(dc_in)); - - //vm.GkvAbrechnungVersion = dc.GkvAbrechnungVersion; - //vm.UrbelegeGesendet = dc.UrbelegeGesendet; } private void SaveNoticeChange(GkvAbrechnungVM vm, string notice) { - var dc = ServiceFacade.DoAccountingServiceSync(x => x.UpdateGkvAbrechnung(vm.CommitToDataContract())); + var dc_in = vm.CommitToDataContract(); - vm.GkvAbrechnungVersion = dc.GkvAbrechnungVersion; - vm.Notice = dc.Notice; + ServiceFacade.DoAccountingServiceAsync(x => x.UpdateGkvAbrechnung(dc_in), dc_out => + { + Dispatcher.Invoke(() => { + vm.UpdateByDataContract(dc_out); + }); + }, false); } private void gridView_CellValueChanged_1(object sender, CellValueChangedEventArgs e) diff --git a/BeWo/ViewModel/GkvAbrechnungVM.cs b/BeWo/ViewModel/GkvAbrechnungVM.cs index ff7f227e4..d51b1a2ee 100644 --- a/BeWo/ViewModel/GkvAbrechnungVM.cs +++ b/BeWo/ViewModel/GkvAbrechnungVM.cs @@ -349,6 +349,21 @@ namespace BeWo.ViewModel (x) => x.ErstelltAm.Value); } + public void UpdateByDataContract(GkvAbrechnungDC pDataContract) + { + GkvAbrechnungVersion = pDataContract.GkvAbrechnungVersion; + + Notice = pDataContract.Notice; + + Betrag = pDataContract.Betrag; + Bezahlt = pDataContract.Bezahlt; + + if (pDataContract.InvoiceBases != null) + { + InvoiceBases2 = pDataContract.InvoiceBases.Select(x => new InvoiceBaseVM(x, true)).ToList(); + InvoiceBases = new BindingList(InvoiceBases2); + } + } protected override void InitByDataContract(GkvAbrechnungDC pDataContract) { _AbrechnungsZeitraumStart = pDataContract.AbrechnungsZeitraumStart; diff --git a/Service/ServiceImplementations/AccountingServiceImp.cs b/Service/ServiceImplementations/AccountingServiceImp.cs index 989046950..a85afbdfa 100644 --- a/Service/ServiceImplementations/AccountingServiceImp.cs +++ b/Service/ServiceImplementations/AccountingServiceImp.cs @@ -837,6 +837,11 @@ namespace BeWo.Service.ServiceImplementations 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); From bd66cb979537badf1d4b038a6c1545db99c2804b Mon Sep 17 00:00:00 2001 From: Rene Evertz Date: Thu, 17 Oct 2024 14:28:30 +0200 Subject: [PATCH 03/46] Checkbox IsEnabled=false >>> IsReadOnly=true --- BeWo/View/Controls/GkvAbrechnungDetailControl.xaml | 4 ++-- .../Detail/Accounting/GkvAbrechnungOverview.xaml.cs | 10 ++++++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/BeWo/View/Controls/GkvAbrechnungDetailControl.xaml b/BeWo/View/Controls/GkvAbrechnungDetailControl.xaml index 0cafc0443..db6a5ede3 100644 --- a/BeWo/View/Controls/GkvAbrechnungDetailControl.xaml +++ b/BeWo/View/Controls/GkvAbrechnungDetailControl.xaml @@ -290,7 +290,7 @@ AllowEditing="False" FieldName="IsPaid" Header="Bezahlt" - ReadOnly="True" /> + IsEnabled="False" /> + IsEnabled="False" /> x.UpdateGkvAbrechnung(vm.CommitToDataContract())); - vm.GkvAbrechnungVersion = dc.GkvAbrechnungVersion; + var dc_in = vm.CommitToDataContract(); + + ServiceFacade.DoAccountingServiceAsync(x => x.UpdateGkvAbrechnung(dc_in), dc_out => + { + Dispatcher.Invoke(() => { + vm.UpdateByDataContract(dc_out); + }); + }, false); } } From 8d4802b3a2d4e8d891ae861948b64184c5a511c0 Mon Sep 17 00:00:00 2001 From: Rene Evertz Date: Thu, 17 Oct 2024 15:54:06 +0200 Subject: [PATCH 04/46] =?UTF-8?q?-=20Ung=C3=BCltige=20Customer=20vorher=20?= =?UTF-8?q?erkennen=20-=20IsEnabled=20geht=20nicht,=20man=20braucht=20IsEn?= =?UTF-8?q?abledBinding=20https://supportcenter.devexpress.com/ticket/deta?= =?UTF-8?q?ils/t1010082/gridcolumn-isenabled-false-has-no-effect?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BeWo/BeWo.csproj | 1 + BeWo/BeWoApp.xaml | 1 + BeWo/Converter/TestDebugConverter.cs | 13 +- BeWo/Converter/TooltipTextConverter.cs | 29 + .../Controls/GkvAbrechnungDetailControl.xaml | 4 +- .../Accounting/NewGkvAbrechnungPopUpView.xaml | 273 ++- .../NewGkvAbrechnungPopUpView.xaml.cs | 445 ++-- BeWo/ViewModel/InvoiceBaseVM.cs | 2018 ++++++++--------- BeWo/ViewModel/OrganisationVM.cs | 4 +- Dakota/DakotaUtils.cs | 14 +- .../InvoiceBaseDC_InvoiceBase.cs | 16 +- .../AccountingServiceImp.cs | 4 +- Shared/Core/DakotaValidator.cs | 48 +- Shared/DataContracts/InvoiceBaseDC.cs | 6 + 14 files changed, 1557 insertions(+), 1319 deletions(-) create mode 100644 BeWo/Converter/TooltipTextConverter.cs diff --git a/BeWo/BeWo.csproj b/BeWo/BeWo.csproj index 2204004c0..a7ba47c65 100644 --- a/BeWo/BeWo.csproj +++ b/BeWo/BeWo.csproj @@ -994,6 +994,7 @@ + diff --git a/BeWo/BeWoApp.xaml b/BeWo/BeWoApp.xaml index 8ae49c75d..4266c9e95 100644 --- a/BeWo/BeWoApp.xaml +++ b/BeWo/BeWoApp.xaml @@ -95,6 +95,7 @@ + + + + + + + + - + - + - + - + - - + + - - - + + + - - -