Files
BeWoPlaner/Dakota/Logic/DakotaInfoCreator.cs

350 lines
14 KiB
C#

using BeWo.Data.Entities;
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 static class DakotaInfoCreator
{
public struct InfoCreatorParameter
{
public InvoiceItem InvoiceItem { get; set; }
public ServiceInvoicePeriod ServiceInvoicePeriod { get; set; }
public ServiceInvoice ServiceInvoice { get; set; }
public InvoiceBase InvoiceBase { get; set; }
public Customer Customer { get; set; }
public string IKKostentrager => "111222333";
public string IKKvkarte => "333444555";
public string Versichertenstatus => "55555";
public string Belegnummer => "444444test";
public string Identifikationsnummer => "111";
}
public struct InfoCreatorParameter2
{
private string _month;
private string Absenderklassifikation => "SL";
private string Dateiidentifizierer => "S";
public string IKAbsender => "109500969";
public string IKEmpfang => "108018007";
public DateTime Created { get; set; }
// SL
// Stellen 3 bis 8 von AbsenderIK
//
public string LogischerDateiname => $"{Absenderklassifikation}{IKAbsender.Substring(2, 6)}{Dateiidentifizierer}{_month}";
public string PhysikalischerDateiname => "idkidkid.txt";
public InfoCreatorParameter2(int month)
{
_month = month.ToString("D2");
Created = DateTime.Now;
}
}
public static int NachrichtenRefenrenz { get; set; }
static DakotaInfoCreator()
{
Reset();
}
internal static void Reset()
{
NachrichtenRefenrenz = 0;
}
internal static 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 static InfoDateiNutzdaten GetEmptyInfoNutzdatendatei(InfoCreatorParameter2 para)
{
var info = new InfoDateiNutzdaten();
info.SyntaxKennung = "UNOC";
info.SyntaxVersion = "3";
info.Absenderbezeichnung = para.IKAbsender;
info.Empfangerbezeichnung = para.IKEmpfang;
info.Created = para.Created;
info.Datenaustauschreferenz = 1;
info.Leistungsbereich = SchlüsselLeistungserbringerSammelgruppenschlussel.SoziotherapeutischerLeistungserbringer;
info.Anwendungsreferenz = para.LogischerDateiname;
info.Testindikator = SchlüsselTestindikator.Testdatei;
return info;
}
internal static InfoDateiAuftrags GetEmptyInfoAuftragsdatei(InfoCreatorParameter2 para)
{
var info = new InfoDateiAuftrags();
info.Identifikator = 500000;
info.Version = 1;
info.LangeAuftrag = 348;
info.SequenzNummer = 000;
info.VerfahrenKennung = "TSOL0";
info.TransferNummer = 000;
info.VerfahrenKennungSpezifikation = "SGB1K";
info.AbsenderEigner = para.IKAbsender;
info.AbsenderPhysikalisch = para.IKAbsender;
info.EmpfangerNutzer = para.IKEmpfang;
info.EmpfangerPhysikalisch = para.IKEmpfang;
info.FehlerNummer = 0;
info.FehlerMassnahme = 0;
info.Dateiname = "aok31052023";
info.DatumErstellung = para.Created.ToString("yyyyMMddhhmmss");
info.DatumUbertragungGesendet = para.Created.ToString("yyyyMMddhhmmss");
info.DatumUbertragungEmpfangenStart = "00000000000000";
info.DatumUbertragungEmpfangenEnde = "00000000000000";
info.DateiVersion = 0;
info.Korrektur = 0;
// info.DateigrosseNutzdaten = 0;
// info.DateigrosseUbertragung = 0;
info.Zeichensatz = "l1";
info.Komprimierung = 0;
info.Verschlusselungsart = 0;
info.ElektronischeUnterschrift = 0;
// info.Satzformat = "";
// info.Satzlange = 0;
// info.Blocklange = 0;
// Part 3 nicht vom Absender
info.EMailAdresseAbsender = "evertz@ownsoft.de";
return info;
}
internal static void AddDakotaInfoFile(this InfoDateiNutzdaten file, InfoCreatorParameter para, InfoCreatorParameter2 para2)
{
var blockkostentrager = file.GetDakotaInfoBlockKostentrager(para, para2);
var blockkvkarte = blockkostentrager.GetDakotaInfoBlockKvKarte(para, para2);
var abrechnungsfall = blockkvkarte.GetDakotaInfoAbrechnungsfall(para, para2);
var abrechnungsposition = abrechnungsfall.GetDakotaInfoAbrechnungsposition(para, para2);
abrechnungsfall.InfosAbrechnungsposition.Add(abrechnungsposition);
}
internal static InfoBlockKostentrager GetDakotaInfoBlockKostentrager(this InfoDateiNutzdaten file, InfoCreatorParameter para, InfoCreatorParameter2 para2)
{
var ikkostentrager = para.IKKostentrager;
var block = file.BlockKostentragers.FirstOrDefault(x => x.IKKostentrager == ikkostentrager);
if (block is null)
{
block = new InfoBlockKostentrager(ikkostentrager)
{
DakotaInfoSLGA = CreateDakotaInfoNachricht(true),
DakotaInfoNachrichtSLGA = CreateDakotaInfoNachrichtSLGA(para, para2)
};
file.BlockKostentragers.Add(block);
}
return block;
}
internal static InfoBlockKvKarte GetDakotaInfoBlockKvKarte(this InfoBlockKostentrager blockkostentrager, InfoCreatorParameter para, InfoCreatorParameter2 para2)
{
var ikkvkarte = para.IKKvkarte;
var block = blockkostentrager.BlockKvKarte.FirstOrDefault(x => x.IKKrankenkasseKVKarte == ikkvkarte);
if (block is null)
{
block = new InfoBlockKvKarte(ikkvkarte)
{
DakotaInfoSLGA = CreateDakotaInfoNachricht(true),
DakotaInfoNachrichtSLGA = CreateDakotaInfoNachrichtSLGA(para, para2),
DakotaInfoSLLA = CreateDakotaInfoNachricht(false),
DakotaInfoNachrichtSLLA = CreateDakotaInfoNachrichtSLLA(para, para2)
};
blockkostentrager.BlockKvKarte.Add(block);
}
return block;
}
internal static InfoAbrechnungsfall GetDakotaInfoAbrechnungsfall(this InfoBlockKvKarte block, InfoCreatorParameter para, InfoCreatorParameter2 para2)
{
var belegnummer = para.Belegnummer;
var fall = block.DakotaInfoNachrichtSLLA.Abrechnungsfalle.FirstOrDefault(x => x.Belegnummer == belegnummer);
if(fall is null)
{
fall = CreateDakotaInfoAbrechnungsfall(para);
block.DakotaInfoNachrichtSLLA.Abrechnungsfalle.Add(fall);
}
return fall;
}
internal static InfoAbrechnungsposition GetDakotaInfoAbrechnungsposition(this InfoAbrechnungsfall fall, InfoCreatorParameter para, InfoCreatorParameter2 para2)
{
var id = para.Identifikationsnummer;
var pos = CreateDakotaInfoAbrechnungsposition(para);
return pos;
}
// -----------------------------------------------------------------------------------------------------------------------------------
private static InfoNachricht CreateDakotaInfoNachricht(bool isSLGA)
{
var info = new InfoNachricht();
var typ = isSLGA ? "SLGA" : "SLLA";
info.Nachrichtenreferenznummer = GetNextRefNumber();
info.NachrichtenTypKennung = typ;
info.NachrichtenVersionsnummer = "18";
info.NachrichtenFreigabeNrTages = "0";
info.NachrichtenVerwaltendeOrganisation = "0";
return info;
}
private static InfoNachrichtSLGA CreateDakotaInfoNachrichtSLGA(InfoCreatorParameter para, InfoCreatorParameter2 para2)
{
var info = new InfoNachrichtSLGA();
info.Verarbeitungskennzeichen = SchlüsselVerarbeitungskennzeichen.AbrechnungOhneBesonderheit;
info.IKAbsender = para2.IKAbsender;
info.IKKostentrager = para.IKKostentrager;
info.IKKvKarte = para.IKKvkarte;
info.IKLeistungserbringer = para2.IKAbsender;
info.Rechnungsnummer = para.InvoiceBase.InvoiceNumber;
info.Rechnungsdatum = para.InvoiceBase.InvoiceDate.Value;
info.Rechnungsart = SchlüsselRechnungsart.AbrechnungVonLeistungserbringer;
info.Summenstatus00 = SchlüsselSummenstatus.Gesamtsumme;
info.Gesamtbruttobetrag00 = para.InvoiceItem.AmountTotal.Value;
info.GesamtbetragZuzahlung00 = 5;
info.Gesamtrechnungsbetrag00 = info.Gesamtbruttobetrag00 - info.GesamtbetragZuzahlung00;
info.Summenstatus = SchlüsselSummenstatus.Mitglieder;
info.Gesamtbruttobetrag = para.InvoiceItem.AmountTotal.Value;
info.GesamtbetragZuzahlung = 5;
info.Gesamtrechnungsbetrag = info.Gesamtbruttobetrag00 - info.GesamtbetragZuzahlung00;
info.Name1 = "Name";
info.Name2 = "Ansprechpartner";
info.Name3 = "Nummer";
info.Name4 = "EMail";
return info;
}
private static InfoNachrichtSLLA CreateDakotaInfoNachrichtSLLA(InfoCreatorParameter para, InfoCreatorParameter2 para2)
{
var info = new InfoNachrichtSLLA();
info.Verarbeitungskennzeichen = SchlüsselVerarbeitungskennzeichen.AbrechnungOhneBesonderheit;
info.IKAbsender = para2.IKAbsender;
info.IKKostentrager = para.IKKostentrager;
info.IKKvKarte = para.IKKvkarte;
info.IKLeistungserbringer = para2.IKAbsender;
info.Rechnungsnummer = para.InvoiceBase.InvoiceNumber;
info.Rechnungsdatum = para.InvoiceBase.InvoiceDate.Value;
info.Rechnungsart = SchlüsselRechnungsart.AbrechnungVonLeistungserbringer;
info.Abrechnungsfalle = new List<InfoAbrechnungsfall>();
return info;
}
private static InfoAbrechnungsfall CreateDakotaInfoAbrechnungsfall(InfoCreatorParameter para)
{
var info = new InfoAbrechnungsfall();
info.VersichtertenNummer = para.IKKvkarte;
info.Versichertenstatus = para.Versichertenstatus;
info.Beleginformation = SchlüsselBeleginformation.KeineBeleguebermittlung;
info.Belegnummer = para.Belegnummer;
info.VersichtertenVorname = para.Customer.Person.FirstName;
info.VersichtertenNachname = para.Customer.Person.LastName;
info.VersichtertenGeburtstag = para.Customer.Person.DateOfBirth.Value;
info.VersichtertenStraßeNr = para.Customer.Person.Address.Street;
info.VersichtertenPLZ = para.Customer.Person.Address.PostalCode;
info.VersichtertenWohnort = para.Customer.Person.Address.Town;
info.VersichtertenLanderkennung = null;
// info.DakotaInfosAbrechnungsposition.Add(GetDakotaInfoAbrechnungsposition(para));
// Kann
// info.DakotaInfoDiagnosen.Add(GetDakotaInfoDiagnosen());
info.GesamtbetragGesetzlicheZuzahlung = 0;
info.GesamtbetragProzentualeZuzahlung = 0;
info.PauschalerZuzahlungsbetrag = 0;
info.GesamtbetragEigenanteil = 0;
info.GesamtbetragBrutto = 0;
return info;
}
private static InfoAbrechnungsposition CreateDakotaInfoAbrechnungsposition(InfoCreatorParameter para)
{
var info = new InfoAbrechnungsposition();
info.Identifikationsnummer = para.Identifikationsnummer;
info.Abrechnungscode = SchlüsselAbrechnungscodes.SoziotherapeutischerLeistungserbringer;
info.TarifkennzeichenBereich = SchlüsselTarifkennzeichenBereich.NordRheinWestfalen;
info.TarifkennzeichenSondertarif = SchlüsselTarifkennzeichenSondertarif.OhneBesonderheiten;
info.AbrechnungspositionArtDerEinrichtung = SchlüsselPosArtDerEinrichtung.SoziotherapeutischerLeistungserbringer;
info.AbrechnungspositionBehandlungsart = SchlüsselPosBehandlungsart.Einzelbehandlung;
info.AbrechnungspositionVergütungsart = SchlüsselPosVergütungsart.Gruppenbehandlung90Minuten9Teilnehmer;
info.AnzahlMenge = para.InvoiceItem.UnitCount.Value;
info.EinzelbetragAbrechnungsposition = para.InvoiceItem.AmountTotal.Value;
info.DatumDerLeistungserbringung = para.InvoiceBase.InvoiceDate.Value;
info.BetragZuzahlung = 0;
return info;
}
private static InfoBlockDiagnosen CreateDakotaInfoDiagnosen()
{
var info = new InfoBlockDiagnosen();
return info;
}
}
}