From 908769ddaf8166c76fc38305c59a044e5cfde076 Mon Sep 17 00:00:00 2001 From: Kojo Date: Tue, 24 Mar 2026 17:32:25 +0100 Subject: [PATCH] =?UTF-8?q?Dakota:=20GKV-Abrechnung=20auch=20f=C3=BCr=20ni?= =?UTF-8?q?cht=C3=A4rztliche=20Dialyseleistungen=20SupportOID=3D157652?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Dakota/Logic/DakotaInfoCreator.cs | 60 +++--- Dakota/Logic/DakotaManager.cs | 172 +++++++++--------- ...lLeistungserbringerSammelgruppenschlussel.cs | 34 ++-- 3 files changed, 139 insertions(+), 127 deletions(-) diff --git a/Dakota/Logic/DakotaInfoCreator.cs b/Dakota/Logic/DakotaInfoCreator.cs index cbc1269af..83d107a58 100644 --- a/Dakota/Logic/DakotaInfoCreator.cs +++ b/Dakota/Logic/DakotaInfoCreator.cs @@ -1,4 +1,4 @@ -using BS.Shared; +using BS.Shared; using Dakota.Models.Infos; using Dakota.Models.Schlüssels; using System; @@ -14,10 +14,20 @@ namespace Dakota.Logic public int NachrichtenRefenrenz { get; set; } public bool IsSammelrechnung { get; set; } + // Leistungserbringer-Sammelgruppenschlüssel (N = Soziotherapie, G = Dialyse) + // Wird im UNB-Segment als S005/Leistungsbereich uebermittelt. + public SchlüsselLeistungserbringerSammelgruppenschlussel Leistungsbereich { get; set; } + + // Standard-Leistungsbereich ist Soziotherapie public DakotaInfoCreator(bool isSammelrechnung = false) + : this(SchlüsselLeistungserbringerSammelgruppenschlussel.SoziotherapeutischerLeistungserbringer, isSammelrechnung) + { + } + + public DakotaInfoCreator(SchlüsselLeistungserbringerSammelgruppenschlussel leistungsbereich, bool isSammelrechnung = false) { NachrichtenRefenrenz = 0; - + Leistungsbereich = leistungsbereich; IsSammelrechnung = isSammelrechnung; } @@ -26,25 +36,6 @@ namespace Dakota.Logic return ++NachrichtenRefenrenz; } - //internal static InfoFile GetDakotaInfoFile(InfoCreatorParameter para) - //{ - // var info = new InfoFile(); - - // info.SyntaxKennung = "UNOC"; - // info.SyntaxVersion = "3"; - // info.Absenderbezeichnung = para.Absender; - // info.Empfangerbezeichnung = para.Empfang; - // info.Created = DateTime.Now; - // info.Datenaustauschreferenz = 1; - // info.Leistungsbereich = SchlüsselLeistungserbringerSammelgruppenschlussel.SoziotherapeutischerLeistungserbringer; - // info.Anwendungsreferenz = "testdateiaa"; - // info.Testindikator = SchlüsselTestindikator.Testdatei; - - // info.BlockKostentragers.Add(GetDakotaInfoBlockKostentrager(para)); - - // return info; - //} - internal InfoDateiNutzdaten GetEmptyInfoNutzdatendatei(string absender, string empfang, int verfahrensstufe, string logischerDateiname, int datenaustauschreferenz) { var info = new InfoDateiNutzdaten(); @@ -54,12 +45,13 @@ namespace Dakota.Logic info.Absenderbezeichnung = absender; info.Empfangerbezeichnung = empfang; info.Datenaustauschreferenz = datenaustauschreferenz; - info.Leistungsbereich = SchlüsselLeistungserbringerSammelgruppenschlussel.SoziotherapeutischerLeistungserbringer; + info.Leistungsbereich = Leistungsbereich; info.Anwendungsreferenz = logischerDateiname; info.Testindikator = SchlüsselTestindikator.GetSchlüsselTestindikator((GkvVerfahrensstufe)verfahrensstufe); return info; } + internal InfoDateiAuftrags GetEmptyInfoAuftragsdatei(string empfang, string logischerDateiname, string verfahrenkennung, int transfernummer) { var info = new InfoDateiAuftrags(); @@ -124,12 +116,13 @@ namespace Dakota.Logic block.DakotaInfoSLGA = CreateDakotaInfoNachricht(true, version); block.DakotaInfoNachrichtSLGA = CreateDakotaInfoNachrichtSLGA(infoParameter); } - + file.BlockKostentragers.Add(block); } return block; } + internal InfoBlockKrankenkasse GetDakotaInfoBlockKvKarte(InfoBlockKostentrager blockkostentrager, InfoParameterInvoiceItem infoParameter, int version) { var ikkrankenkasse = infoParameter.IKKrankenkasse; @@ -149,12 +142,13 @@ namespace Dakota.Logic return block; } + internal InfoAbrechnungsfall GetDakotaInfoAbrechnungsfall(InfoBlockKrankenkasse block, InfoParameterInvoiceItem infoParameter) { var belegnummer = infoParameter.Customer.CustomerOid.ToString(); var fall = block.DakotaInfoNachrichtSLLA.Abrechnungsfalle.FirstOrDefault(x => x.Belegnummer == belegnummer); - if(fall is null) + if (fall is null) { fall = CreateDakotaInfoAbrechnungsfall(infoParameter); block.DakotaInfoNachrichtSLLA.Abrechnungsfalle.Add(fall); @@ -162,10 +156,10 @@ namespace Dakota.Logic return fall; } + internal InfoAbrechnungsposition GetDakotaInfoAbrechnungsposition(InfoAbrechnungsfall fall, InfoParameterInvoiceItem infoParameter) { var pos = CreateDakotaInfoAbrechnungsposition(infoParameter); - return pos; } @@ -184,6 +178,7 @@ namespace Dakota.Logic return info; } + private InfoNachrichtSLGA CreateDakotaInfoNachrichtSLGA(InfoParameterInvoiceItem infoParameter) { var info = new InfoNachrichtSLGA(); @@ -205,6 +200,7 @@ namespace Dakota.Logic return info; } + private InfoNachrichtSLLA CreateDakotaInfoNachrichtSLLA(InfoParameterInvoiceItem infoParameter) { var info = new InfoNachrichtSLLA(); @@ -223,6 +219,7 @@ namespace Dakota.Logic return info; } + private InfoAbrechnungsfall CreateDakotaInfoAbrechnungsfall(InfoParameterInvoiceItem infoParameter) { var info = new InfoAbrechnungsfall(); @@ -234,7 +231,8 @@ namespace Dakota.Logic info.VersichtertenVorname = infoParameter.Customer.FirstName; info.VersichtertenNachname = infoParameter.Customer.LastName; - info.VersichtertenGeburtstag = infoParameter.Customer.DateOfBirth.Value; + if (infoParameter.Customer.DateOfBirth != null) + info.VersichtertenGeburtstag = infoParameter.Customer.DateOfBirth.Value; info.VersichtertenStraßeNr = infoParameter.Customer.Street; info.VersichtertenPLZ = infoParameter.Customer.PostalCode; info.VersichtertenWohnort = infoParameter.Customer.Town; @@ -242,12 +240,13 @@ namespace Dakota.Logic return info; } + private InfoAbrechnungsposition CreateDakotaInfoAbrechnungsposition(InfoParameterInvoiceItem infoParameter) { var info = new InfoAbrechnungsposition(); var leistungserbringergruppe = infoParameter.Organisation.Leistungserbringergruppe; - if(leistungserbringergruppe.Length == 5) + if (leistungserbringergruppe.Length == 5) { info.Abrechnungscode = "69"; info.Tarifkennzeichen = leistungserbringergruppe; @@ -259,7 +258,10 @@ namespace Dakota.Logic } else { - throw new ArgumentOutOfRangeException(nameof(infoParameter.Organisation.Leistungserbringergruppe), infoParameter.Organisation.Leistungserbringergruppe.Length, "Leistungserbringergruppe 7 Stellen oder 5 Stelle ohne Abrechnungscode"); + throw new ArgumentOutOfRangeException( + nameof(infoParameter.Organisation.Leistungserbringergruppe), + infoParameter.Organisation.Leistungserbringergruppe.Length, + "Leistungserbringergruppe 7 Stellen oder 5 Stelle ohne Abrechnungscode"); } info.AbrechnungspositionString = infoParameter.Abrechnungsposition; @@ -271,10 +273,10 @@ namespace Dakota.Logic return info; } + private InfoBlockDiagnosen CreateDakotaInfoDiagnosen() { var info = new InfoBlockDiagnosen(); - return info; } } diff --git a/Dakota/Logic/DakotaManager.cs b/Dakota/Logic/DakotaManager.cs index 98a842f93..4b568a753 100644 --- a/Dakota/Logic/DakotaManager.cs +++ b/Dakota/Logic/DakotaManager.cs @@ -1,6 +1,7 @@ -using BS.Shared.DataContracts; +using BS.Shared.DataContracts; using BS.Shared.Models; using Dakota.Models.Infos; +using Dakota.Models.Schlüssels; using System; using System.Collections.Generic; using System.IO; @@ -10,111 +11,120 @@ using System.Threading.Tasks; namespace Dakota.Logic { - public class DakotaManager - { - public int Month { get; set; } - public int Version { get; set; } + public class DakotaManager + { + public int Month { get; set; } + public int Version { get; set; } - public DakotaInfoCreator DakotaInfoCreator { get; set; } - public bool IsSammelrechnung { get; set; } + public DakotaInfoCreator DakotaInfoCreator { get; set; } + public bool IsSammelrechnung { get; set; } - public Dictionary DakotaFileDict { get; set; } + public Dictionary DakotaFileDict { get; set; } - public Dictionary DakotaInfoNutzDict { get; set; } - public Dictionary DakotaInfoAufDict { get; set; } + public Dictionary DakotaInfoNutzDict { get; set; } + public Dictionary DakotaInfoAufDict { get; set; } - public DakotaManager() : this(DateTime.Now.Month, DateTime.Now) - { + public DakotaManager() : this(DateTime.Now.Month, DateTime.Now) + { + } - } - public DakotaManager(int month, DateTime dateTime, bool isSammelrechnung = false) - { - Month = month; - Version = GetVersion(dateTime); + public DakotaManager(int month, DateTime dateTime, bool isSammelrechnung = false) + : this(month, dateTime, + SchlüsselLeistungserbringerSammelgruppenschlussel.SoziotherapeutischerLeistungserbringer, + isSammelrechnung) + { + } - DakotaFileDict = new Dictionary(); + public DakotaManager(int month, DateTime dateTime, + SchlüsselLeistungserbringerSammelgruppenschlussel leistungsbereich, + bool isSammelrechnung = false) + { + Month = month; + Version = GetVersion(dateTime); - DakotaInfoNutzDict = new Dictionary(); - DakotaInfoAufDict = new Dictionary(); + DakotaFileDict = new Dictionary(); - DakotaInfoCreator = new DakotaInfoCreator(isSammelrechnung); - IsSammelrechnung = isSammelrechnung; - } + DakotaInfoNutzDict = new Dictionary(); + DakotaInfoAufDict = new Dictionary(); - public void Add(ServiceInvoiceDC serviceInvoice, OrganisationDC organisation, CustomerDC customer, AddressInformation address, int datenaustauschreferenz, int transfernummer) - { - var ik_datenannahmestelle = organisation.IKDatenannahmestelle; - var success = DakotaInfoNutzDict.TryGetValue(ik_datenannahmestelle, out InfoDateiNutzdaten nutzdaten); + DakotaInfoCreator = new DakotaInfoCreator(leistungsbereich, isSammelrechnung); + IsSammelrechnung = isSammelrechnung; + } - if (!success) - { - var verfahrensstufe = organisation.Verfahrensstufe; + public void Add(ServiceInvoiceDC serviceInvoice, OrganisationDC organisation, CustomerDC customer, AddressInformation address, int datenaustauschreferenz, int transfernummer) + { + var ik_datenannahmestelle = organisation.IKDatenannahmestelle; + var success = DakotaInfoNutzDict.TryGetValue(ik_datenannahmestelle, out InfoDateiNutzdaten nutzdaten); - // Verfahrenkennung - // Erste Stelle: - // "E" - Echtdaten - // "T" - Testdaten - // Annahme: "E" auch für Erprobungsverfahrenstufe - // Zusatz: "T" bei Erprobungsverfahrenstufe + if (!success) + { + var verfahrensstufe = organisation.Verfahrensstufe; - var isTest = verfahrensstufe == BS.Shared.GkvVerfahrensstufe.Test || verfahrensstufe == BS.Shared.GkvVerfahrensstufe.Erprobung; - var verfahrenkennung = isTest ? "TSOL0" : "ESOL0"; - var logischer_dateiname = DakotaConfig.GetLogischerDateiname(Month).Trim(); + // Verfahrenkennung + // Erste Stelle: + // "E" - Echtdaten + // "T" - Testdaten + // Annahme: "E" auch für Erprobungsverfahrenstufe + // Zusatz: "T" bei Erprobungsverfahrenstufe - var info_nutz_add = DakotaInfoCreator.GetEmptyInfoNutzdatendatei(DakotaConfig.IKAbsender, organisation.IKDatenannahmestelle, (int)verfahrensstufe, logischer_dateiname, datenaustauschreferenz); - var info_auf_add = DakotaInfoCreator.GetEmptyInfoAuftragsdatei(organisation.IKDatenannahmestelle, logischer_dateiname, verfahrenkennung, transfernummer); + var isTest = verfahrensstufe == BS.Shared.GkvVerfahrensstufe.Test || verfahrensstufe == BS.Shared.GkvVerfahrensstufe.Erprobung; + var verfahrenkennung = isTest ? "TSOL0" : "ESOL0"; + var logischer_dateiname = DakotaConfig.GetLogischerDateiname(Month).Trim(); - DakotaInfoNutzDict.Add(ik_datenannahmestelle, info_nutz_add); - DakotaInfoAufDict.Add(ik_datenannahmestelle, info_auf_add); + var info_nutz_add = DakotaInfoCreator.GetEmptyInfoNutzdatendatei(DakotaConfig.IKAbsender, organisation.IKDatenannahmestelle, (int)verfahrensstufe, logischer_dateiname, datenaustauschreferenz); + var info_auf_add = DakotaInfoCreator.GetEmptyInfoAuftragsdatei(organisation.IKDatenannahmestelle, logischer_dateiname, verfahrenkennung, transfernummer); - nutzdaten = info_nutz_add; - } + DakotaInfoNutzDict.Add(ik_datenannahmestelle, info_nutz_add); + DakotaInfoAufDict.Add(ik_datenannahmestelle, info_auf_add); - foreach (var peroid in serviceInvoice.ServiceInvoicePeriods) - { - foreach (var invoice in peroid.InvoiceItems) - { - var info_nutz_item = new InfoParameterInvoiceItem(serviceInvoice, invoice, organisation, customer, address); + nutzdaten = info_nutz_add; + } - DakotaInfoCreator.AddInfoParameter(nutzdaten, info_nutz_item, Version); - } - } - } + foreach (var peroid in serviceInvoice.ServiceInvoicePeriods) + { + foreach (var invoice in peroid.InvoiceItems) + { + var info_nutz_item = new InfoParameterInvoiceItem(serviceInvoice, invoice, organisation, customer, address); - public void Apply() - { - foreach (var ik_datenannahmestelle in DakotaInfoNutzDict.Keys) - { - var file = new DakotaFile(DateTime.Now); + DakotaInfoCreator.AddInfoParameter(nutzdaten, info_nutz_item, Version); + } + } + } - var info_nutz = DakotaInfoNutzDict[ik_datenannahmestelle]; - var info_auf = DakotaInfoAufDict[ik_datenannahmestelle]; + public void Apply() + { + foreach (var ik_datenannahmestelle in DakotaInfoNutzDict.Keys) + { + var file = new DakotaFile(DateTime.Now); - file.Nutzdatendatei.Apply(info_nutz, DakotaInfoCreator.IsSammelrechnung); - file.Auftragsdatei.Apply(info_auf); + var info_nutz = DakotaInfoNutzDict[ik_datenannahmestelle]; + var info_auf = DakotaInfoAufDict[ik_datenannahmestelle]; - DakotaFileDict.Add(ik_datenannahmestelle, file); - } - } + file.Nutzdatendatei.Apply(info_nutz, DakotaInfoCreator.IsSammelrechnung); + file.Auftragsdatei.Apply(info_auf); - private int GetVersion(DateTime create4month) - { - if (create4month < new DateTime(2023, 7, 1)) - throw new NotImplementedException("Keine Unterstützung von Version 17 oder niedriger"); + DakotaFileDict.Add(ik_datenannahmestelle, file); + } + } - if (create4month < new DateTime(2024, 1, 1)) - return 18; + private int GetVersion(DateTime create4month) + { + if (create4month < new DateTime(2023, 7, 1)) + throw new NotImplementedException("Keine Unterstützung von Version 17 oder niedriger"); - if (create4month < new DateTime(2024, 7, 1)) - return 19; + if (create4month < new DateTime(2024, 1, 1)) + return 18; - if (create4month < new DateTime(2026, 1, 1)) - return 20; + if (create4month < new DateTime(2024, 7, 1)) + return 19; - if (create4month < new DateTime(2027, 1, 1)) - return 21; + if (create4month < new DateTime(2026, 1, 1)) + return 20; - throw new NotImplementedException("Keine Unterstützung von Version 22 oder aufwärts"); - } - } + if (create4month < new DateTime(2027, 1, 1)) + return 21; + + throw new NotImplementedException("Keine Unterstützung von Version 22 oder aufwärts"); + } + } } diff --git a/Dakota/Models/Schlüssels/SchlüsselLeistungserbringerSammelgruppenschlussel.cs b/Dakota/Models/Schlüssels/SchlüsselLeistungserbringerSammelgruppenschlussel.cs index bafe90fea..114cb9504 100644 --- a/Dakota/Models/Schlüssels/SchlüsselLeistungserbringerSammelgruppenschlussel.cs +++ b/Dakota/Models/Schlüssels/SchlüsselLeistungserbringerSammelgruppenschlussel.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Text; @@ -10,22 +10,22 @@ namespace Dakota.Models.Schlüssels { public SchlüsselLeistungserbringerSammelgruppenschlussel(string val) : base(val) { } - public static SchlüsselLeistungserbringerSammelgruppenschlussel LeistungserbringerVonHilfsmitteln => new SchlüsselLeistungserbringerSammelgruppenschlussel("A"); - public static SchlüsselLeistungserbringerSammelgruppenschlussel LeistungserbringerVonHeilmitteln => new SchlüsselLeistungserbringerSammelgruppenschlussel("B"); - public static SchlüsselLeistungserbringerSammelgruppenschlussel LeistungserbringerVonHäuslicherKrankenpflege => new SchlüsselLeistungserbringerSammelgruppenschlussel("C"); - public static SchlüsselLeistungserbringerSammelgruppenschlussel LeistungserbringerVonHaushaltshilfe => new SchlüsselLeistungserbringerSammelgruppenschlussel("D"); + public static SchlüsselLeistungserbringerSammelgruppenschlussel LeistungserbringerVonHilfsmitteln => new SchlüsselLeistungserbringerSammelgruppenschlussel("A"); + public static SchlüsselLeistungserbringerSammelgruppenschlussel LeistungserbringerVonHeilmitteln => new SchlüsselLeistungserbringerSammelgruppenschlussel("B"); + public static SchlüsselLeistungserbringerSammelgruppenschlussel LeistungserbringerVonHäuslicherKrankenpflege => new SchlüsselLeistungserbringerSammelgruppenschlussel("C"); + public static SchlüsselLeistungserbringerSammelgruppenschlussel LeistungserbringerVonHaushaltshilfe => new SchlüsselLeistungserbringerSammelgruppenschlussel("D"); public static SchlüsselLeistungserbringerSammelgruppenschlussel LeistungserbringerVonKrankentransportleistungen => new SchlüsselLeistungserbringerSammelgruppenschlussel("E"); - public static SchlüsselLeistungserbringerSammelgruppenschlussel Hebammen => new SchlüsselLeistungserbringerSammelgruppenschlussel("F"); - public static SchlüsselLeistungserbringerSammelgruppenschlussel NichtArztlicheDialyseachleistung => new SchlüsselLeistungserbringerSammelgruppenschlussel("G"); - public static SchlüsselLeistungserbringerSammelgruppenschlussel LeistungserbringerVonRehabilitationssport => new SchlüsselLeistungserbringerSammelgruppenschlussel("H"); - public static SchlüsselLeistungserbringerSammelgruppenschlussel LeistungserbringerVonFunktionstraining => new SchlüsselLeistungserbringerSammelgruppenschlussel("I"); - public static SchlüsselLeistungserbringerSammelgruppenschlussel WeitereSonstigeLeistungserbringer => new SchlüsselLeistungserbringerSammelgruppenschlussel("J"); - public static SchlüsselLeistungserbringerSammelgruppenschlussel LeistungserbringerPräventions => new SchlüsselLeistungserbringerSammelgruppenschlussel("K"); - public static SchlüsselLeistungserbringerSammelgruppenschlussel LeistungserbringerRehamassnahmen => new SchlüsselLeistungserbringerSammelgruppenschlussel("L"); - public static SchlüsselLeistungserbringerSammelgruppenschlussel SozialpädiatrischeZentren => new SchlüsselLeistungserbringerSammelgruppenschlussel("M"); - public static SchlüsselLeistungserbringerSammelgruppenschlussel SoziotherapeutischerLeistungserbringer => new SchlüsselLeistungserbringerSammelgruppenschlussel("N"); - public static SchlüsselLeistungserbringerSammelgruppenschlussel SAPV => new SchlüsselLeistungserbringerSammelgruppenschlussel("O"); - public static SchlüsselLeistungserbringerSammelgruppenschlussel LeistungserbringerNach132gSGB => new SchlüsselLeistungserbringerSammelgruppenschlussel("P"); - public static SchlüsselLeistungserbringerSammelgruppenschlussel Kurzzeitpflege => new SchlüsselLeistungserbringerSammelgruppenschlussel("Q"); + public static SchlüsselLeistungserbringerSammelgruppenschlussel Hebammen => new SchlüsselLeistungserbringerSammelgruppenschlussel("F"); + public static SchlüsselLeistungserbringerSammelgruppenschlussel NichtÄrztlicheDialysesachleistung => new SchlüsselLeistungserbringerSammelgruppenschlussel("G"); + public static SchlüsselLeistungserbringerSammelgruppenschlussel LeistungserbringerVonRehabilitationssport => new SchlüsselLeistungserbringerSammelgruppenschlussel("H"); + public static SchlüsselLeistungserbringerSammelgruppenschlussel LeistungserbringerVonFunktionstraining => new SchlüsselLeistungserbringerSammelgruppenschlussel("I"); + public static SchlüsselLeistungserbringerSammelgruppenschlussel WeitereSonstigeLeistungserbringer => new SchlüsselLeistungserbringerSammelgruppenschlussel("J"); + public static SchlüsselLeistungserbringerSammelgruppenschlussel LeistungserbringerPräventions => new SchlüsselLeistungserbringerSammelgruppenschlussel("K"); + public static SchlüsselLeistungserbringerSammelgruppenschlussel LeistungserbringerRehamassnahmen => new SchlüsselLeistungserbringerSammelgruppenschlussel("L"); + public static SchlüsselLeistungserbringerSammelgruppenschlussel SozialpädiatrischeZentren => new SchlüsselLeistungserbringerSammelgruppenschlussel("M"); + public static SchlüsselLeistungserbringerSammelgruppenschlussel SoziotherapeutischerLeistungserbringer => new SchlüsselLeistungserbringerSammelgruppenschlussel("N"); + public static SchlüsselLeistungserbringerSammelgruppenschlussel SAPV => new SchlüsselLeistungserbringerSammelgruppenschlussel("O"); + public static SchlüsselLeistungserbringerSammelgruppenschlussel LeistungserbringerNach132gSGB => new SchlüsselLeistungserbringerSammelgruppenschlussel("P"); + public static SchlüsselLeistungserbringerSammelgruppenschlussel Kurzzeitpflege => new SchlüsselLeistungserbringerSammelgruppenschlussel("Q"); } }