diff --git a/BeWo/ServiceProxy/Generated.cs b/BeWo/ServiceProxy/Generated.cs index ebe56270f..3c02aa316 100644 --- a/BeWo/ServiceProxy/Generated.cs +++ b/BeWo/ServiceProxy/Generated.cs @@ -2049,7 +2049,8 @@ namespace BeWo.ServiceProxy [System.ServiceModel.ServiceKnownTypeAttribute(typeof(System.Collections.Generic.List))] [System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.DataContracts.GkvAbrechnungDC))] [System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.DataContracts.GkvAbrechnungViewFilterDC))] - [System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.DataContracts.GkvAbrechnungFilterDC))] + [System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.DataContracts.GkvAbrechnungRequestDC))] + [System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.DataContracts.GkvAbrechnungResponseDC))] [System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.InvoiceType))] [System.ServiceModel.ServiceKnownTypeAttribute(typeof(System.IO.MemoryStream))] [System.ServiceModel.ServiceKnownTypeAttribute(typeof(System.IO.Stream))] @@ -6049,7 +6050,8 @@ namespace BeWo.ServiceProxy [System.ServiceModel.ServiceKnownTypeAttribute(typeof(System.Collections.Generic.List))] [System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.DataContracts.GkvAbrechnungDC))] [System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.DataContracts.GkvAbrechnungViewFilterDC))] - [System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.DataContracts.GkvAbrechnungFilterDC))] + [System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.DataContracts.GkvAbrechnungRequestDC))] + [System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.DataContracts.GkvAbrechnungResponseDC))] [System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.InvoiceType))] [System.ServiceModel.ServiceKnownTypeAttribute(typeof(System.IO.MemoryStream))] [System.ServiceModel.ServiceKnownTypeAttribute(typeof(System.IO.Stream))] @@ -9389,7 +9391,11 @@ namespace BeWo.ServiceProxy [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IAccountingService/MakeNewGkvAbrechnung", ReplyAction="http://tempuri.org/IAccountingService/MakeNewGkvAbrechnungResponse")] [System.ServiceModel.FaultContractAttribute(typeof(BeWo.ServiceProxy.BeWoFault), Action="http://tempuri.org/IAccountingService/MakeNewGkvAbrechnungBeWoFaultFault", Name="BeWoFault", Namespace="http://schemas.datacontract.org/2004/07/BeWo.Service.ServiceContracts")] - BS.Shared.DataContracts.GkvAbrechnungDC MakeNewGkvAbrechnung(BS.Shared.DataContracts.GkvAbrechnungFilterDC abrechnungFilterDC); + BS.Shared.DataContracts.GkvAbrechnungDC MakeNewGkvAbrechnung(BS.Shared.DataContracts.GkvAbrechnungRequestDC abrechnungFilterDC); + + [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IAccountingService/CreateNewGkvAbrechnung", ReplyAction="http://tempuri.org/IAccountingService/CreateNewGkvAbrechnungResponse")] + [System.ServiceModel.FaultContractAttribute(typeof(BeWo.ServiceProxy.BeWoFault), Action="http://tempuri.org/IAccountingService/CreateNewGkvAbrechnungBeWoFaultFault", Name="BeWoFault", Namespace="http://schemas.datacontract.org/2004/07/BeWo.Service.ServiceContracts")] + BS.Shared.DataContracts.GkvAbrechnungResponseDC CreateNewGkvAbrechnung(BS.Shared.DataContracts.GkvAbrechnungRequestDC request); } [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] @@ -9601,10 +9607,15 @@ namespace BeWo.ServiceProxy return base.Channel.GetFilteredGkvAbrechnungen(gkvAbrechnungViewFilter); } - public BS.Shared.DataContracts.GkvAbrechnungDC MakeNewGkvAbrechnung(BS.Shared.DataContracts.GkvAbrechnungFilterDC abrechnungFilterDC) + public BS.Shared.DataContracts.GkvAbrechnungDC MakeNewGkvAbrechnung(BS.Shared.DataContracts.GkvAbrechnungRequestDC abrechnungFilterDC) { return base.Channel.MakeNewGkvAbrechnung(abrechnungFilterDC); } + + public BS.Shared.DataContracts.GkvAbrechnungResponseDC CreateNewGkvAbrechnung(BS.Shared.DataContracts.GkvAbrechnungRequestDC request) + { + return base.Channel.CreateNewGkvAbrechnung(request); + } } [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] diff --git a/BeWo/ServiceProxy/ServiceFacade.cs b/BeWo/ServiceProxy/ServiceFacade.cs index 38074fb33..60555648c 100644 --- a/BeWo/ServiceProxy/ServiceFacade.cs +++ b/BeWo/ServiceProxy/ServiceFacade.cs @@ -906,8 +906,6 @@ namespace BeWo.ServiceProxy else { String allMessage = String.Format("{0}", e); - - if (!String.IsNullOrEmpty(allMessage) && allMessage.IndexOf("Es war kein an https://") >= 0 && allMessage.IndexOf("lauschender Endpunkt") >= 0) { diff --git a/BeWo/View/BeWoWindowBuilder.cs b/BeWo/View/BeWoWindowBuilder.cs index 2f16f1873..996c4457e 100644 --- a/BeWo/View/BeWoWindowBuilder.cs +++ b/BeWo/View/BeWoWindowBuilder.cs @@ -44,5 +44,10 @@ namespace BeWo.View return beWoWindow; } + + public static void ShowErrorMessageBox(string text) + { + MessageBox.Show(text, "Fehler", MessageBoxButton.OK, MessageBoxImage.Asterisk); + } } } diff --git a/BeWo/View/Detail/Accounting/GkvAbrechnungOverview.xaml b/BeWo/View/Detail/Accounting/GkvAbrechnungOverview.xaml index 766344501..0926e6c34 100644 --- a/BeWo/View/Detail/Accounting/GkvAbrechnungOverview.xaml +++ b/BeWo/View/Detail/Accounting/GkvAbrechnungOverview.xaml @@ -64,6 +64,7 @@ + diff --git a/BeWo/View/Detail/Accounting/GkvAbrechnungOverview.xaml.cs b/BeWo/View/Detail/Accounting/GkvAbrechnungOverview.xaml.cs index f4092432d..c18755637 100644 --- a/BeWo/View/Detail/Accounting/GkvAbrechnungOverview.xaml.cs +++ b/BeWo/View/Detail/Accounting/GkvAbrechnungOverview.xaml.cs @@ -61,16 +61,22 @@ namespace BeWo.View.Detail.Accounting this.MainControl.CloseCurrentPopUp(); var checked_invoice_bases = _NewGkvAbrechnungPopUpView.ViewModel.InvoiceBases.Where(x => x.IsChecked).Select(x => x.DataContract.InvoiceBaseOid.Value).ToList(); var gkv_abrechnung = e.Data.First(); - var gkv_filter = new GkvAbrechnungFilterDC(gkv_abrechnung); + var gkv_filter = new GkvAbrechnungRequestDC(gkv_abrechnung); gkv_filter.SelectedInvoiceBases = checked_invoice_bases; - ServiceFacade.DoAccountingServiceAsync( - svc => svc.MakeNewGkvAbrechnung(gkv_filter), - () => Dispatcher.BeginInvoke(DispatcherPriority.Normal, + ServiceFacade.DoAccountingServiceAsync(x => x.CreateNewGkvAbrechnung(gkv_filter), + cb => Dispatcher.BeginInvoke(DispatcherPriority.Normal, (Action)delegate { - RefreshGkvAbrechnungenList(); + if (cb.Success) + { + RefreshGkvAbrechnungenList(); + } + else + { + BeWoWindowBuilder.ShowErrorMessageBox(cb.Error); + } })); }; @@ -317,10 +323,10 @@ namespace BeWo.View.Detail.Accounting GkvAbrechnungDC gkvAbrechnungDC = new GkvAbrechnungDC(); int year = DateTime.Now.Year; int month = DateTime.Now.Month - 1; - gkvAbrechnungDC.AbrechnungsZeitraumStart = new DateTime(1999, 1, 1); - //new DateTime(year, month, 1); + gkvAbrechnungDC.AbrechnungsZeitraumStart = new DateTime(year, month, 1); gkvAbrechnungDC.AbrechnungsZeitraumEnde = new DateTime(year, month, DateTime.DaysInMonth(year, month)); GkvAbrechnungVM gkvAbrechnungVM = new GkvAbrechnungVM(gkvAbrechnungDC); + _NewGkvAbrechnungPopUpView.Clear(); _NewGkvAbrechnungPopUpView.ViewModel = gkvAbrechnungVM; this.MainControl.ShowControlAsModalPopup(this._NewGkvAbrechnungPopUpView); } @@ -354,7 +360,6 @@ namespace BeWo.View.Detail.Accounting return list; } - } } \ No newline at end of file diff --git a/BeWo/View/Detail/Accounting/NewGkvAbrechnungPopUpView .xaml.cs b/BeWo/View/Detail/Accounting/NewGkvAbrechnungPopUpView .xaml.cs index 160db5d1b..4be9b6dd8 100644 --- a/BeWo/View/Detail/Accounting/NewGkvAbrechnungPopUpView .xaml.cs +++ b/BeWo/View/Detail/Accounting/NewGkvAbrechnungPopUpView .xaml.cs @@ -35,7 +35,8 @@ namespace BeWo.View.Detail.Accounting (s, e) => { this._InvoiceBaseDCs?.Clear(); - this.Fire(); + if (CancelButtonClicked != null) + CancelButtonClicked.Invoke(s, e); })); this.grid_newInvoices.View.Loaded += (s, e) => ((TableView)this.grid_newInvoices.View).BestFitColumns(); @@ -85,6 +86,12 @@ namespace BeWo.View.Detail.Accounting } } + public void Clear() + { + popupedit_GkvSearch.Text = string.Empty; + popupedit_GkvSearch.Focus(); + } + private void btn_cancel_Click(object sender, RoutedEventArgs e) { if (ViewModel.InvoiceBases != null) @@ -97,11 +104,6 @@ namespace BeWo.View.Detail.Accounting this.Fire(); } - private void btn_delete_Click(object sender, RoutedEventArgs e) - { - this._InvoiceBaseDCs.Remove(this.grid_newInvoices.GetCurrentValue()); - } - private void TableView_CellValueChanging(object sender, CellValueChangedEventArgs e) { var si = e.Row as InvoiceBaseDC; @@ -133,6 +135,7 @@ namespace BeWo.View.Detail.Accounting { popup_organisation.IsOpen = false; gkvsearchview.ItemSelected -= gkvsearchview_OrganisationSelected; + ViewModel.IKVersichertenKarte = e.Data.IKKrankenkasse; ViewModel.IKDatenannahmestelle = e.Data.IKDatenannahmestelle; diff --git a/BeWo/ViewModel/GkvAbrechnungVM.cs b/BeWo/ViewModel/GkvAbrechnungVM.cs index c9fca8fd8..34792085d 100644 --- a/BeWo/ViewModel/GkvAbrechnungVM.cs +++ b/BeWo/ViewModel/GkvAbrechnungVM.cs @@ -55,6 +55,7 @@ AntwortEntschluesseltAm private string _Nutzdatendatei; private string _Auftragsdatei; private string _Transfername; + private int _Datenaustauschreferenz; private DateTime? _ErstelltAm; private DateTime? _VerschluesseltAm; @@ -223,6 +224,22 @@ AntwortEntschluesseltAm } } + [ValidationAttribute(ValidationRule = ValidationRules.NotNullOrStringEmpty)] + public int Datenaustauschreferenz + { + get { return this._Datenaustauschreferenz; } + + set + { + if (this.AreDifferent(this._Datenaustauschreferenz, value)) + { + this._Datenaustauschreferenz = value; + this.StoreDirtyInformation(this.AreDifferent(this.DataContract.Datenaustauschreferenz, value), nameof(Datenaustauschreferenz)); + this.FirePropertyChanged(nameof(Datenaustauschreferenz)); + } + } + } + [Validation(ValidationRule = ValidationRules.NotNullOrStringEmpty)] public DateTime? ErstelltAm { @@ -402,6 +419,7 @@ AntwortEntschluesseltAm _AntwortErhaltenAm = pDataContract.AntwortErhaltenAm; _AntwortEntschluesseltAm = pDataContract.AntwortEntschluesseltAm; _ErstelltAm = pDataContract.ErstelltAm; + _Datenaustauschreferenz = pDataContract.Datenaustauschreferenz; _GkvAbrechnungOid = pDataContract.GkvAbrechnungOid; _GkvAbrechnungVersion = pDataContract.GkvAbrechnungVersion; @@ -431,6 +449,7 @@ AntwortEntschluesseltAm pDataContract.Notice = _Notice; pDataContract.Betrag = _Betrag; + pDataContract.Datenaustauschreferenz = _Datenaustauschreferenz; return pDataContract; } diff --git a/Dakota/Dakota.csproj b/Dakota/Dakota.csproj index 0476521d7..f67ebff75 100644 --- a/Dakota/Dakota.csproj +++ b/Dakota/Dakota.csproj @@ -50,6 +50,7 @@ + diff --git a/Dakota/DakotaValidator.cs b/Dakota/DakotaValidator.cs index cd120b751..d240b34bc 100644 --- a/Dakota/DakotaValidator.cs +++ b/Dakota/DakotaValidator.cs @@ -1,4 +1,6 @@ -using System; +using BS.Shared.DataContracts; +using Dakota.Models; +using System; using System.Collections.Generic; using System.Linq; using System.Text; @@ -15,5 +17,63 @@ namespace Dakota input = input.Replace(specialChar, DakotaConfig.Aufhebungszeichen + specialChar); } } + + /// + /// Validiert in erster Phase die Daten. Bei Fehler wird eine DakotaException geworfen. + /// + public static void ValidateFirstStep(MandatorDC mandatordc) + { + if (mandatordc == null) + throw new DakotaException("Mandator ist null"); + + if (!ValidateIKNumber(mandatordc.IKLeistungserbringer)) + throw new DakotaException("Die IK Nummer des Leistungserbringers ist ungültig."); + } + + /// + /// Validiert in zweiter Phase die Daten. Bei Fehler wird eine DakotaException geworfen. + /// + public static void ValidateSecondStep(OrganisationDC orgadc, CustomerDC customerDC) + { + string error = null; + + if (orgadc == null) + error = "Organisation ist null"; + else if (customerDC == null) + error = "Customer ist null"; + else if (!ValidateIKNumber(orgadc.IKDatenannahmestelle)) + error = $"Die Organisation \"{orgadc.Name}\" hat keine gültige IK Nummer für die Datenannahmestelle."; + else if (!ValidateIKNumber(orgadc.IKKostentrager)) + error = $"Die Organisation \"{orgadc.Name}\" hat keine gültige IK Nummer für die Kostenträger."; + else if (!ValidateIKNumber(orgadc.IKKrankenkasse)) + error = $"Die Organisation \"{orgadc.Name}\" hat keine gültige IK Nummer für die Krankenkasse."; + else if (!ValidateVersichertenstatus(customerDC.VersichertenStatus)) + error = $"Der Klient \"{customerDC.LastName}, {customerDC.FirstName}\" hat keinen gültigen Versichertenstatus"; + + if (error != null) + throw new DakotaException(error); + } + + 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) + return false; + + return true; + } } } diff --git a/Dakota/Logic/DakotaInfoCreator.cs b/Dakota/Logic/DakotaInfoCreator.cs index dd459d0f3..bd9520468 100644 --- a/Dakota/Logic/DakotaInfoCreator.cs +++ b/Dakota/Logic/DakotaInfoCreator.cs @@ -228,7 +228,7 @@ namespace Dakota.Logic var info = new InfoAbrechnungsfall(); info.VersichtertenNummer = infoParameter.Customer.InsuranceNumber; - info.Versichertenstatus = "50000"; + info.Versichertenstatus = infoParameter.Customer.VersichertenStatus; //infoParameter.Customer.VersichertenStatus; info.Beleginformation = SchlüsselBeleginformation.KeineBeleguebermittlung; info.Belegnummer = infoParameter.Customer.CustomerOid.ToString(); diff --git a/Dakota/Logic/DakotaManager.cs b/Dakota/Logic/DakotaManager.cs index 3f789e703..b3f8c49b9 100644 --- a/Dakota/Logic/DakotaManager.cs +++ b/Dakota/Logic/DakotaManager.cs @@ -62,7 +62,7 @@ namespace Dakota.Logic } catch(Exception e) { - + throw e; } } diff --git a/Dakota/Models/DakotaException.cs b/Dakota/Models/DakotaException.cs new file mode 100644 index 000000000..e335fbbee --- /dev/null +++ b/Dakota/Models/DakotaException.cs @@ -0,0 +1,24 @@ +using Dakota.Models.Daten; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Dakota.Models +{ + public class DakotaException : ArgumentException + { + public string Message { get; set; } + + public DakotaException(string message) : this() + { + Message = message; + } + + public DakotaException() + { + + } + } +} diff --git a/Dakota/Models/Daten/Datenelement.cs b/Dakota/Models/Daten/Datenelement.cs index 0542dd3c5..7cc3e3dac 100644 --- a/Dakota/Models/Daten/Datenelement.cs +++ b/Dakota/Models/Daten/Datenelement.cs @@ -36,8 +36,7 @@ namespace Dakota.Models.Daten if (Feldart == Feldart.Muss) { // Auffüllen - throw new ArgumentOutOfRangeException(Title, _Value, "muss gefühlt sein"); - // throw new NotImplementedException("Error Code: 3483091097896"); + throw new DakotaException($"Das Feld \"{Title}\" muss gefüllt sein!"); } else { @@ -47,9 +46,16 @@ namespace Dakota.Models.Daten } } - if (!_IgnoreCheck && (_Value.Length < MinStellen || _Value.Length > MaxStellen)) + if (!_IgnoreCheck) { - throw new NotImplementedException("Error Code: 3483091097897"); + if(_Value.Length < MinStellen) + { + throw new DakotaException($"Das Feld \"{Title}\" hat bei der Auswertung {_Value.Length} Stellen ergeben! Nach Vorgabe muss es jedoch mindestens {MinStellen} Stellen haben"); + } + else if (_Value.Length > MaxStellen) + { + throw new DakotaException($"Das Feld \"{Title}\" hat bei der Auswertung {_Value.Length} Stellen ergeben! Nach Vorgabe darf es jedoch maximal {MaxStellen} Stellen haben"); + } } return _Value; @@ -81,14 +87,15 @@ namespace Dakota.Models.Daten if (value is null) return; - if (value.Length < MinStellen || value.Length > MaxStellen) + if (value.Length < MinStellen) { - throw new ArgumentOutOfRangeException(Title, value, $"Wertebereich: min:max = ({MinStellen}:{MaxStellen})"); + throw new DakotaException($"Das Feld \"{Title}\" hat bei der Erstellung {_Value.Length} Stellen ergeben! Nach Vorgabe muss es jedoch mindestens {MinStellen} Stellen haben"); + } + + if (value.Length > MaxStellen) + { + throw new DakotaException($"Das Feld \"{Title}\" hat bei der Erstellung {_Value.Length} Stellen ergeben! Nach Vorgabe darf es jedoch maximal {MaxStellen} Stellen haben"); } - //else - //{ - // throw new ArgumentOutOfRangeException(Title, value, "value ist kein string"); - //} DakotaValidator.ClearTextString(value); diff --git a/Dakota/Models/Infos/InfoDateiNutzdaten.cs b/Dakota/Models/Infos/InfoDateiNutzdaten.cs index 7f88808a8..bda270587 100644 --- a/Dakota/Models/Infos/InfoDateiNutzdaten.cs +++ b/Dakota/Models/Infos/InfoDateiNutzdaten.cs @@ -21,7 +21,7 @@ namespace Dakota.Models.Infos get { return _Datenaustauschreferenz; } set { - if (value < 1) + if (value < 0) throw new ArgumentOutOfRangeException("Datenaustauschreferenz", "Referenz darf nicht negativ sein"); else if (value == 0) throw new ArgumentOutOfRangeException("Datenaustauschreferenz", "Referenz darf nicht gleich null sein"); diff --git a/Data/Access/SearchDAO.cs b/Data/Access/SearchDAO.cs index 3f3ec3d44..2e9f6de9c 100644 --- a/Data/Access/SearchDAO.cs +++ b/Data/Access/SearchDAO.cs @@ -5923,5 +5923,22 @@ namespace BeWo.Data.Access return criteria.List().ToList(); } + + public int GetLastDatenaustauschreferenz(string datenannahmestelle) + { + var criteria = CreateCriteria() + .Add(Restrictions.Where(x => x.IKDatenannahmestelle == datenannahmestelle)); + + criteria.AddOrder(Order.Desc(nameof(GkvAbrechnung.Oid))); + + criteria.SetMaxResults(1); + + var list = criteria.List().ToList(); + + if (!list.Any()) + return 0; + + return list.First().Datenaustauschreferenz; + } } } diff --git a/Data/Entities/GkvAbrechnung.cs b/Data/Entities/GkvAbrechnung.cs index ae81206df..f13da8e3e 100644 --- a/Data/Entities/GkvAbrechnung.cs +++ b/Data/Entities/GkvAbrechnung.cs @@ -32,6 +32,8 @@ namespace BeWo.Data.Entities public virtual string Transfername { get; set; } + public virtual int Datenaustauschreferenz { get; set; } + public virtual DateTime? ErstelltAm { get; set; } public virtual DateTime? VerschluesseltAm { get; set; } diff --git a/Data/Mappings/GkvAbrechnung.hbm.xml b/Data/Mappings/GkvAbrechnung.hbm.xml index 1fd06bfe7..c5d7c6d0a 100644 --- a/Data/Mappings/GkvAbrechnung.hbm.xml +++ b/Data/Mappings/GkvAbrechnung.hbm.xml @@ -17,6 +17,7 @@ + diff --git a/Model/Changes_2024_04_18_GkvAbrechnung.txt b/Model/Changes_2024_04_18_GkvAbrechnung.txt new file mode 100644 index 000000000..accb52d76 --- /dev/null +++ b/Model/Changes_2024_04_18_GkvAbrechnung.txt @@ -0,0 +1,29 @@ +CREATE TABLE `gkvabrechnung` ( + `Oid` bigint NOT NULL AUTO_INCREMENT, + `Tid` int NOT NULL, + `Notice` varchar(1024) DEFAULT NULL, + `InsTs` datetime DEFAULT NULL, + `InsUser` varchar(256) DEFAULT NULL, + `Version` bigint DEFAULT NULL, + `UdpUser` varchar(256) DEFAULT NULL, + `IsActive` tinyint DEFAULT NULL, + `SystemEntryID` int DEFAULT NULL, + `Kundennummer` varchar(256) DEFAULT NULL, + `IKLeistungserbringer` varchar(256) DEFAULT NULL, + `IKVersichertenKarte` varchar(256) DEFAULT NULL, + `IKKostentrager` varchar(256) DEFAULT NULL, + `IKDatenannahmestelle` varchar(256) DEFAULT NULL, + `AbrechnungsZeitraumStart` datetime DEFAULT NULL, + `AbrechnungsZeitraumEnde` datetime DEFAULT NULL, + `Nutzdatendatei` text, + `Auftragsdatei` varchar(1024) DEFAULT NULL, + `Transfername` varchar(256) DEFAULT NULL, + `Datenaustauschreferenz` int DEFAULT NULL, + `ErstelltAm` datetime DEFAULT NULL, + `VerschluesseltAm` datetime DEFAULT NULL, + `UebertragenAm` datetime DEFAULT NULL, + `AntwortErhaltenAm` datetime DEFAULT NULL, + `AntwortEntschluesseltAm` datetime DEFAULT NULL, + `Betrag` decimal(18,10) DEFAULT NULL, + PRIMARY KEY (`Oid`) +) ENGINE=InnoDB AUTO_INCREMENT=30 DEFAULT CHARSET=latin1 \ No newline at end of file diff --git a/Service/DCEntityMapper/GkvAbrechnungDC_GkvAbrechnung.cs b/Service/DCEntityMapper/GkvAbrechnungDC_GkvAbrechnung.cs index 4bdb29db6..7fd72c769 100644 --- a/Service/DCEntityMapper/GkvAbrechnungDC_GkvAbrechnung.cs +++ b/Service/DCEntityMapper/GkvAbrechnungDC_GkvAbrechnung.cs @@ -26,6 +26,7 @@ namespace BeWo.Service.DCEntityMapper pDataContract.Nutzdatendatei = pEntity.Nutzdatendatei; pDataContract.Auftragsdatei = pEntity.Auftragsdatei; pDataContract.Transfername = pEntity.Transfername; + pDataContract.Datenaustauschreferenz = pEntity.Datenaustauschreferenz; pDataContract.UebertragenAm = pEntity.UebertragenAm; pDataContract.AntwortErhaltenAm = pEntity.AntwortErhaltenAm; @@ -59,6 +60,7 @@ namespace BeWo.Service.DCEntityMapper pEntity.Nutzdatendatei = pDataContract.Nutzdatendatei; pEntity.Auftragsdatei = pDataContract.Auftragsdatei; pEntity.Transfername = pDataContract.Transfername; + pEntity.Datenaustauschreferenz = pDataContract.Datenaustauschreferenz; pEntity.ErstelltAm = pDataContract.ErstelltAm; pEntity.VerschluesseltAm = pDataContract.VerschluesseltAm; diff --git a/Service/ServiceContracts/IAccountingService.cs b/Service/ServiceContracts/IAccountingService.cs index d2fa77201..86632a5fb 100644 --- a/Service/ServiceContracts/IAccountingService.cs +++ b/Service/ServiceContracts/IAccountingService.cs @@ -154,6 +154,10 @@ namespace BeWo.Service.ServiceContracts [FaultContract(typeof(BeWoFault))] [OperationContract] - GkvAbrechnungDC MakeNewGkvAbrechnung(GkvAbrechnungFilterDC abrechnungFilterDC); + GkvAbrechnungDC MakeNewGkvAbrechnung(GkvAbrechnungRequestDC abrechnungFilterDC); + + [FaultContract(typeof(BeWoFault))] + [OperationContract] + GkvAbrechnungResponseDC CreateNewGkvAbrechnung(GkvAbrechnungRequestDC request); } } \ No newline at end of file diff --git a/Service/ServiceImplementations/AccountingServiceImp.cs b/Service/ServiceImplementations/AccountingServiceImp.cs index 0801adc3f..f4cd7c606 100644 --- a/Service/ServiceImplementations/AccountingServiceImp.cs +++ b/Service/ServiceImplementations/AccountingServiceImp.cs @@ -18,6 +18,8 @@ using BS.Shared.DataContracts; using Utils = BeWo.Service.Core.Utils; using BeWo.Service.Invoicing; using Dakota.Logic; +using Dakota; +using Dakota.Models; namespace BeWo.Service.ServiceImplementations { @@ -719,11 +721,15 @@ namespace BeWo.Service.ServiceImplementations } } - public GkvAbrechnungDC MakeNewGkvAbrechnung(GkvAbrechnungFilterDC abrechnungFilterDC) + public GkvAbrechnungResponseDC CreateNewGkvAbrechnung(GkvAbrechnungRequestDC request) { + var response = new GkvAbrechnungResponseDC(); + try { - var test_datetime = abrechnungFilterDC.GkvAbrechnungDC.AbrechnungsZeitraumStart.Value; + var gkv_abrechnung_dc = request.GkvAbrechnungDC; + + var test_datetime = gkv_abrechnung_dc.AbrechnungsZeitraumStart.Value; var manager = new DakotaManager(test_datetime.Month, DateTime.Now); @@ -731,7 +737,9 @@ namespace BeWo.Service.ServiceImplementations var loaded_invoicebases = new List(); - foreach (var invoicebase_oid in abrechnungFilterDC.SelectedInvoiceBases) + DakotaValidator.ValidateFirstStep(mandatordc); + + foreach (var invoicebase_oid in request.SelectedInvoiceBases) { var service = DAOFactory.SearchDAO.GetServiceInvoiceByInvoiceBaseOid(invoicebase_oid); var invoicebase = DAOFactory.GenericDAO.GetByID(invoicebase_oid); @@ -746,18 +754,19 @@ namespace BeWo.Service.ServiceImplementations var orgadc = MapperFactory.OrganisationDC_OrganisationMapper.MapToNewDC(orga); var customerdc = MapperFactory.CustomerDC_Customer.MapToNewDC(customer); + DakotaValidator.ValidateSecondStep(orgadc, customerdc); + manager.Add(servicedc, orgadc, customerdc, mandatordc); } manager.Apply(); - if(manager.DakotaFileDict.Count != 1 || manager.DakotaFileDict.First().Value.GetKostenträgerCount() != 1) + if (manager.DakotaFileDict.Count != 1 || manager.DakotaFileDict.First().Value.GetKostenträgerCount() != 1) { - throw new NotImplementedException(); + throw new DakotaException("Unerwartete Anzahl an Dakota Files berechnet."); } var file_from_manager = manager.DakotaFileDict.First().Value; - var gkv_abrechnung_dc = abrechnungFilterDC.GkvAbrechnungDC; var nutzdatendatei = file_from_manager.GetNutzdatendatei(); @@ -768,22 +777,24 @@ namespace BeWo.Service.ServiceImplementations // that indicates the number of bytes in the value. if (nutzdatendatei.Length > 65535) { - throw new ArgumentOutOfRangeException("nutzdatendatei", $"Länger als 65535: {nutzdatendatei.Length}"); + throw new DakotaException($"nutzdatendatei - Länger als 65535: {nutzdatendatei.Length}"); } - gkv_abrechnung_dc.IKDatenannahmestelle = file_from_manager.GetIKDatenannahmestelle(); - gkv_abrechnung_dc.IKKostenträger= file_from_manager.GetIKKostenträger(); - gkv_abrechnung_dc.IKLeistungserbringer= file_from_manager.GetIKLeistungserbringer(); + var datenannahmestelle = file_from_manager.GetIKDatenannahmestelle(); + var datenaustauschreferenz = DAOFactory.SearchDAO.GetLastDatenaustauschreferenz(datenannahmestelle); + + gkv_abrechnung_dc.IKDatenannahmestelle = datenannahmestelle; + gkv_abrechnung_dc.IKKostenträger = file_from_manager.GetIKKostenträger(); + gkv_abrechnung_dc.IKLeistungserbringer = file_from_manager.GetIKLeistungserbringer(); gkv_abrechnung_dc.IKVersichertenKarte = file_from_manager.GetIKVersichertenKarte(); gkv_abrechnung_dc.Auftragsdatei = file_from_manager.GetAuftragsdatei(); gkv_abrechnung_dc.Nutzdatendatei = file_from_manager.GetNutzdatendatei(); gkv_abrechnung_dc.Transfername = file_from_manager.GetTransferName(); + gkv_abrechnung_dc.Datenaustauschreferenz = datenaustauschreferenz + 1; gkv_abrechnung_dc.ErstelltAm = file_from_manager.Created; - gkv_abrechnung_dc.Betrag = file_from_manager.GetBetrag(); - gkv_abrechnung_dc.InvoiceBases = loaded_invoicebases; var gkv_abrechnung = MapperFactory.GkvAbrechnungDC_GkvAbrechnung.MapToNewEntity(gkv_abrechnung_dc); @@ -792,12 +803,24 @@ namespace BeWo.Service.ServiceImplementations var new_gkv_abrechnung_dc = MapperFactory.GkvAbrechnungDC_GkvAbrechnung.MapToNewDC(gkv_abrechnung); - return new_gkv_abrechnung_dc; + response.Success = true; + response.GkvAbrechnungDC = new_gkv_abrechnung_dc; + } + catch(DakotaException exc) + { + response.Error = exc.Message; } catch (Exception e) { throw Utils.CreateBeWoFaultException(e); } + + return response; + } + + public GkvAbrechnungDC MakeNewGkvAbrechnung(GkvAbrechnungRequestDC abrechnungFilterDC) + { + return null; } public List InsertNewGkvAbrechnungen(List dcList) diff --git a/Shared/DataContracts/GkvAbrechnungDC.cs b/Shared/DataContracts/GkvAbrechnungDC.cs index 0ca8f250a..b73cae65b 100644 --- a/Shared/DataContracts/GkvAbrechnungDC.cs +++ b/Shared/DataContracts/GkvAbrechnungDC.cs @@ -44,6 +44,9 @@ namespace BS.Shared.DataContracts [DataMember] public string Transfername { get; set; } + [DataMember] + public int Datenaustauschreferenz { get; set; } + [DataMember] public DateTime? ErstelltAm { get; set; } diff --git a/Shared/DataContracts/GkvAbrechnungFilterDC.cs b/Shared/DataContracts/GkvAbrechnungRequestDC.cs similarity index 73% rename from Shared/DataContracts/GkvAbrechnungFilterDC.cs rename to Shared/DataContracts/GkvAbrechnungRequestDC.cs index 8af896d24..0e26ce505 100644 --- a/Shared/DataContracts/GkvAbrechnungFilterDC.cs +++ b/Shared/DataContracts/GkvAbrechnungRequestDC.cs @@ -8,13 +8,13 @@ using System.Threading.Tasks; namespace BS.Shared.DataContracts { [DataContract] - public class GkvAbrechnungFilterDC : IDataContract + public class GkvAbrechnungRequestDC : IDataContract { - public GkvAbrechnungFilterDC(GkvAbrechnungDC gkvAbrechnungDC) : base() + public GkvAbrechnungRequestDC(GkvAbrechnungDC gkvAbrechnungDC) : base() { GkvAbrechnungDC = gkvAbrechnungDC; } - public GkvAbrechnungFilterDC() + public GkvAbrechnungRequestDC() { } diff --git a/Shared/DataContracts/GkvAbrechnungResponseDC.cs b/Shared/DataContracts/GkvAbrechnungResponseDC.cs new file mode 100644 index 000000000..b3e6b6cd3 --- /dev/null +++ b/Shared/DataContracts/GkvAbrechnungResponseDC.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.Serialization; +using System.Text; +using System.Threading.Tasks; + +namespace BS.Shared.DataContracts +{ + [DataContract] + public class GkvAbrechnungResponseDC : IDataContract + { + [DataMember] + public bool Success { get; set; } + + [DataMember] + public string Error { get; set; } + + [DataMember] + public GkvAbrechnungDC GkvAbrechnungDC { get; set; } + } +} diff --git a/Shared/Shared.csproj b/Shared/Shared.csproj index 256e88079..5fdca84ae 100644 --- a/Shared/Shared.csproj +++ b/Shared/Shared.csproj @@ -184,8 +184,9 @@ + - +