Dakota: GKV-Abrechnung auch für nichtärztliche Dialyseleistungen

SupportOID=157652
This commit is contained in:
2026-03-24 17:32:25 +01:00
parent 2af1ebfe47
commit 908769ddaf
3 changed files with 139 additions and 127 deletions

View File

@@ -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;
}
}

View File

@@ -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<string, DakotaFile> DakotaFileDict { get; set; }
public Dictionary<string, DakotaFile> DakotaFileDict { get; set; }
public Dictionary<string, InfoDateiNutzdaten> DakotaInfoNutzDict { get; set; }
public Dictionary<string, InfoDateiAuftrags> DakotaInfoAufDict { get; set; }
public Dictionary<string, InfoDateiNutzdaten> DakotaInfoNutzDict { get; set; }
public Dictionary<string, InfoDateiAuftrags> 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<string, DakotaFile>();
public DakotaManager(int month, DateTime dateTime,
SchlüsselLeistungserbringerSammelgruppenschlussel leistungsbereich,
bool isSammelrechnung = false)
{
Month = month;
Version = GetVersion(dateTime);
DakotaInfoNutzDict = new Dictionary<string, InfoDateiNutzdaten>();
DakotaInfoAufDict = new Dictionary<string, InfoDateiAuftrags>();
DakotaFileDict = new Dictionary<string, DakotaFile>();
DakotaInfoCreator = new DakotaInfoCreator(isSammelrechnung);
IsSammelrechnung = isSammelrechnung;
}
DakotaInfoNutzDict = new Dictionary<string, InfoDateiNutzdaten>();
DakotaInfoAufDict = new Dictionary<string, InfoDateiAuftrags>();
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");
}
}
}

View File

@@ -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");
}
}