Files
BeWoPlaner/Dakota/Logic/DakotaInfoCreator.cs

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