Files
BeWoPlaner/Dakota/Logic/DakotaInfoCreator.cs

321 lines
14 KiB
C#

using BS.Shared;
using Dakota.Models.Infos;
using Dakota.Models.Schlüssels;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Dakota.Logic
{
public class DakotaInfoCreator
{
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;
}
internal int GetNextRefNumber()
{
return ++NachrichtenRefenrenz;
}
internal InfoDateiNutzdaten GetEmptyInfoNutzdatendatei(string absender, string empfang, int verfahrensstufe, string logischerDateiname, int datenaustauschreferenz)
{
var info = new InfoDateiNutzdaten();
info.SyntaxKennung = "UNOC";
info.SyntaxVersion = "3";
info.Absenderbezeichnung = absender;
info.Empfangerbezeichnung = empfang;
info.Datenaustauschreferenz = datenaustauschreferenz;
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();
info.Identifikator = 500000;
info.Version = 1;
info.LangeAuftrag = 348;
info.SequenzNummer = 000;
info.VerfahrenKennung = verfahrenkennung;
info.TransferNummer = transfernummer;
info.VerfahrenKennungSpezifikation = "SGB1K";
info.AbsenderEigner = DakotaConfig.IKAbsender;
info.AbsenderPhysikalisch = DakotaConfig.IKAbsender;
info.EmpfangerNutzer = empfang;
info.EmpfangerPhysikalisch = empfang;
info.FehlerNummer = 0;
info.FehlerMassnahme = 0;
info.Dateiname = logischerDateiname;
info.DatumUbertragungEmpfangenStart = "00000000000000";
info.DatumUbertragungEmpfangenEnde = "00000000000000";
info.DateiVersion = 0;
info.Korrektur = 0;
// info.DateigrosseNutzdaten = 0;
// info.DateigrosseUbertragung = 0;
info.Zeichensatz = "I1";
info.Komprimierung = 0;
info.Verschlusselungsart = 0;
info.ElektronischeUnterschrift = 0;
info.Satzformat = " ";
info.Satzlange = 0;
info.Blocklange = 0;
// Part 3 nicht vom Absender
info.EMailAdresseAbsender = "dakota.exchange@ownsoft.de";
return info;
}
internal void AddInfoParameter(InfoDateiNutzdaten file, InfoParameterInvoiceItem infoParameter, int version)
{
var blockkostentrager = GetDakotaInfoBlockKostentrager(file, infoParameter, version);
var blockkvkarte = GetDakotaInfoBlockKvKarte(blockkostentrager, infoParameter, version);
var abrechnungsfall = GetDakotaInfoAbrechnungsfall(blockkvkarte, infoParameter);
var abrechnungsposition = GetDakotaInfoAbrechnungsposition(abrechnungsfall, infoParameter);
abrechnungsfall.InfosAbrechnungsposition.Add(abrechnungsposition);
}
internal InfoBlockKostentrager GetDakotaInfoBlockKostentrager(InfoDateiNutzdaten file, InfoParameterInvoiceItem infoParameter, int version)
{
var ikkostentrager = infoParameter.IKKostentrager;
var block = file.BlockKostentragers.FirstOrDefault(x => x.IKKostentrager == ikkostentrager);
if (block is null)
{
block = new InfoBlockKostentrager(ikkostentrager);
if (IsSammelrechnung)
{
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;
var block = blockkostentrager.BlockKvKarte.FirstOrDefault(x => x.IKKrankenkasse == ikkrankenkasse);
if (block is null)
{
block = new InfoBlockKrankenkasse(ikkrankenkasse)
{
DakotaInfoSLGA = CreateDakotaInfoNachricht(true, version),
DakotaInfoNachrichtSLGA = CreateDakotaInfoNachrichtSLGA(infoParameter),
DakotaInfoSLLA = CreateDakotaInfoNachricht(false, version),
DakotaInfoNachrichtSLLA = CreateDakotaInfoNachrichtSLLA(infoParameter)
};
blockkostentrager.BlockKvKarte.Add(block);
}
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)
{
fall = CreateDakotaInfoAbrechnungsfall(infoParameter);
block.DakotaInfoNachrichtSLLA.Abrechnungsfalle.Add(fall);
}
return fall;
}
internal InfoAbrechnungsposition GetDakotaInfoAbrechnungsposition(InfoAbrechnungsfall fall, InfoParameterInvoiceItem infoParameter)
{
var pos = CreateDakotaInfoAbrechnungsposition(infoParameter);
return pos;
}
// -----------------------------------------------------------------------------------------------------------------------------------
private InfoNachricht CreateDakotaInfoNachricht(bool isSLGA, int version)
{
var info = new InfoNachricht();
var typ = isSLGA ? "SLGA" : "SLLA";
info.Nachrichtenreferenznummer = GetNextRefNumber();
info.NachrichtenTypKennung = typ;
info.NachrichtenVersionsnummer = version.ToString();
info.NachrichtenFreigabeNrTages = "0";
info.NachrichtenVerwaltendeOrganisation = "0";
return info;
}
private InfoNachrichtSLGA CreateDakotaInfoNachrichtSLGA(InfoParameterInvoiceItem infoParameter)
{
var info = new InfoNachrichtSLGA();
info.Verarbeitungskennzeichen = SchlüsselVerarbeitungskennzeichen.AbrechnungOhneBesonderheit;
info.IKAbsender = DakotaConfig.IKAbsender;
info.IKKostentrager = infoParameter.IKKostentrager;
info.IKKrankenkasse = infoParameter.IKKrankenkasse;
info.IKLeistungserbringer = infoParameter.AddressInformation.IKLeistungserbringer;
info.Rechnungsnummer = infoParameter.InvoiceBase.InvoiceNumber;
info.Rechnungsdatum = infoParameter.InvoiceBase.InvoiceDate.Value;
info.Rechnungsart = SchlüsselRechnungsart.AbrechnungÜberAbrechnungsstelleOhneInkassovollmacht;
info.Name1 = infoParameter.AddressInformation.OrganisationName;
info.Name2 = infoParameter.AddressInformation.Phone;
info.Name3 = string.Empty;
info.Name4 = infoParameter.AddressInformation.Mail;
//"Entwicklung dakota.exchange@ownsoft.de";
return info;
}
private InfoNachrichtSLLA CreateDakotaInfoNachrichtSLLA(InfoParameterInvoiceItem infoParameter)
{
var info = new InfoNachrichtSLLA();
info.Verarbeitungskennzeichen = SchlüsselVerarbeitungskennzeichen.AbrechnungOhneBesonderheit;
info.IKAbsender = DakotaConfig.IKAbsender;
info.IKKostentrager = infoParameter.IKKostentrager;
info.IKKrankenkasse = infoParameter.IKKrankenkasse;
info.IKLeistungserbringer = infoParameter.AddressInformation.IKLeistungserbringer;
info.Rechnungsnummer = infoParameter.InvoiceBase.InvoiceNumber;
info.Rechnungsdatum = infoParameter.InvoiceBase.InvoiceDate.Value;
info.Rechnungsart = SchlüsselRechnungsart.AbrechnungÜberAbrechnungsstelleOhneInkassovollmacht;
info.Abrechnungsfalle = new List<InfoAbrechnungsfall>();
return info;
}
private InfoAbrechnungsfall CreateDakotaInfoAbrechnungsfall(InfoParameterInvoiceItem infoParameter)
{
var info = new InfoAbrechnungsfall();
info.VersichtertenNummer = infoParameter.Customer.InsuranceNumber;
info.Versichertenstatus = DakotaUtils.GetVersichertenstatus(infoParameter.Customer.VersichertenStatus);
info.Beleginformation = SchlüsselBeleginformation.BelegePerPost;
info.Belegnummer = infoParameter.Customer.CustomerOid.ToString();
info.VersichtertenVorname = infoParameter.Customer.FirstName;
info.VersichtertenNachname = infoParameter.Customer.LastName;
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;
info.VersichtertenLanderkennung = null;
// HPK-spezifische Infos
if (Leistungsbereich.Equals(SchlüsselLeistungserbringerSammelgruppenschlussel.LeistungserbringerVonHäuslicherKrankenpflege))
{
info.Verordnungsdatum = infoParameter.Customer.Medikamentenverordnungslisten
?.FirstOrDefault(l => l.Gueltig)
?.Medikamentenverordnungen
?.Where(m => m.Verordnungsdatum.HasValue)
?.Max(m => m.Verordnungsdatum);
// TODO: Verordnungsdatum, Genehmigungskennzeichen und DatumGenehmigung am Customer speichern und hier auslesen
if (info.Verordnungsdatum is null)
info.Verordnungsdatum = new DateTime(2025, 6, 30);
info.Genehmigungskennzeichen = infoParameter.Customer.InsuranceNumber;
info.DatumDerGenehmigung = new DateTime(2025, 6, 30);
info.ArtDerGenehmigung = SchlüsselArtDerGenehmigung.HkpGenehmigungImEinzelfall;
if (infoParameter.Customer.ICD10DiagnosisCodes?.Any() is true)
{
foreach (var code in infoParameter.Customer.ICD10DiagnosisCodes)
{
info.DakotaInfoDiagnosen.Add(new InfoBlockDiagnosen
{
Diagnoseschlüssel = code,
Diagnosetext = infoParameter.Customer.ICD10Diagnosis
});
}
}
}
return info;
}
private InfoAbrechnungsposition CreateDakotaInfoAbrechnungsposition(InfoParameterInvoiceItem infoParameter)
{
var info = new InfoAbrechnungsposition();
var leistungserbringergruppe = infoParameter.Organisation.Leistungserbringergruppe;
if (leistungserbringergruppe.Length == 5)
{
info.Abrechnungscode = "69";
info.Tarifkennzeichen = leistungserbringergruppe;
}
else if (leistungserbringergruppe.Length == 7)
{
if (leistungserbringergruppe.Substring(0, 2).Equals("99"))
info.Abrechnungscode = "69";
else if (leistungserbringergruppe.Substring(0, 2).Equals("30"))
info.Abrechnungscode = "31";
else
info.Abrechnungscode = leistungserbringergruppe.Substring(0, 2);
info.Tarifkennzeichen = leistungserbringergruppe.Substring(2, 5);
}
else
{
throw new ArgumentOutOfRangeException(
nameof(infoParameter.Organisation.Leistungserbringergruppe),
infoParameter.Organisation.Leistungserbringergruppe.Length,
"Leistungserbringergruppe 7 Stellen oder 5 Stelle ohne Abrechnungscode");
}
info.AbrechnungspositionString = infoParameter.Abrechnungsposition;
info.AnzahlMenge = infoParameter.InvoiceItem.UnitCount.Value;
info.EinzelbetragAbrechnungsposition = infoParameter.InvoiceItem.AmountPerUnit.Value;
info.DatumDerLeistungserbringung = infoParameter.InvoiceItem.ItemPeriodStart.Value;
info.Uhrzeit = infoParameter.InvoiceItem.ServiceRecord?.Start;
info.UhrzeitBis = infoParameter.InvoiceItem.ServiceRecord?.End;
info.BetragZuzahlung = 0;
return info;
}
private InfoBlockDiagnosen CreateDakotaInfoDiagnosen()
{
var info = new InfoBlockDiagnosen();
return info;
}
}
}