283 lines
12 KiB
C#
283 lines
12 KiB
C#
using BS.Shared;
|
|
using BS.Shared.DataContracts;
|
|
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; }
|
|
|
|
public DakotaInfoCreator(bool isSammelrechnung = false)
|
|
{
|
|
NachrichtenRefenrenz = 0;
|
|
|
|
IsSammelrechnung = isSammelrechnung;
|
|
}
|
|
|
|
internal int GetNextRefNumber()
|
|
{
|
|
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();
|
|
|
|
info.SyntaxKennung = "UNOC";
|
|
info.SyntaxVersion = "3";
|
|
info.Absenderbezeichnung = absender;
|
|
info.Empfangerbezeichnung = empfang;
|
|
info.Datenaustauschreferenz = datenaustauschreferenz;
|
|
info.Leistungsbereich = SchlüsselLeistungserbringerSammelgruppenschlussel.SoziotherapeutischerLeistungserbringer;
|
|
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 = infoParameter.AddressInformation.Mail;
|
|
info.Name4 = "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;
|
|
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;
|
|
|
|
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)
|
|
{
|
|
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.BetragZuzahlung = 0;
|
|
|
|
return info;
|
|
}
|
|
private InfoBlockDiagnosen CreateDakotaInfoDiagnosen()
|
|
{
|
|
var info = new InfoBlockDiagnosen();
|
|
|
|
return info;
|
|
}
|
|
}
|
|
}
|