Files
BeWoPlaner/Dakota/Models/Blocke/BlockKlient.cs

199 lines
8.5 KiB
C#
Raw Normal View History

2023-09-15 16:33:11 +02:00
using Dakota.Models.Segmente;
using Dakota.Models.Nachrichten;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Dakota.Models.Segmente.SLLA;
using Dakota.Models.Infos;
2023-09-15 16:33:11 +02:00
namespace Dakota.Models.Blocke
2023-09-15 16:33:11 +02:00
{
internal class BlockKlient : Block
2023-09-15 16:33:11 +02:00
{
/// <summary>
/// Das Segment enthält die Versichertendaten eines Abrechnungsfalles (Verordnung), und gilt gleichzeitig als BeginnSegment für einen Abrechnungsfall. Jeder Abrechnungsfall ist
/// mit einer eindeutigen Belegnummer zu kennzeichnen, die der
/// auf der Verordnung zu übertragenen Belegnummer(s. § 4 des
/// Richtlinientextes) entsprechen muss.
/// </summary>
public SegmentSLLAINV SegmentSLLAINV { get; private set; }
/// <summary>
/// Dieses Segment enthält bei Korrekturlieferungen die ursprünglichen Rechnungsinformationen. Es wird zunächst nur
/// in Abhängigkeit für die Verarbeitungskennzeichen
/// '02' Nachforderung,
/// 03 Zuzahlungsforderung und
/// 04 Korrekturrechnung
/// (Schlüsselverzeichnis Anlage 3, Kapitel 8.1.7) geliefert
/// </summary>
public SegmentSLLAURI SegmentSLLAURI { get; private set; }
/// <summary>
/// Das Segment enthält den Namen und die Adressdaten des
/// Versicherten.
/// </summary>
public SegmentSLLANAD SegmentSLLANAD { get; private set; }
/// <summary>
/// Das Segment enthält den Imagenamen bei Übermittlung von
/// Imagearchiven durch den Absender.
/// </summary>
public SegmentSLLAIMG SegmentSLLAIMG { get; private set; }
/// <summary>
/// ENF je Abrechnungsposition
/// SUT 0-1 je ENF
/// TXT 0-1 je ENF
/// MWS 0-1 je ENF
2023-09-15 16:33:11 +02:00
/// </summary>
public List<BlockAbrechnungsposition> BlockAbrechnungspositions { get; set; }
2023-09-15 16:33:11 +02:00
/// <summary>
/// Das Segment enthält Angaben über die Zuzahlung. Das Segment ist bis auf weiteres nicht zu übermitteln. Das Segment ist
/// für spätere Ausprägungen reserviert.
/// </summary>
public SegmentSLLAZUZ SegmentSLLAZUZ { get; private set; }
2023-09-15 16:33:11 +02:00
/// <summary>
/// Das Segment enthält allgemeine Angaben zum Abrechnungsfall (Verordnung) und ist zu übermitteln, wenn eine ärztliche
/// Verordnung, ein Reparatur- oder Berechtigungsschein oder
/// Unfall/BVG vorliegt.
/// </summary>
public SegmentSLLAZUV SegmentSLLAZUV { get; private set; }
public List<BlockDiagnose> BlockDiagnose { get; set; }
2023-09-15 16:33:11 +02:00
/// <summary>
/// Das Segment enthält Angaben über die von der Krankenkasse
/// ausgesprochene Kostenzusage/Genehmigung und ist nur zu
/// übermitteln, wenn diese vorliegt.
/// </summary>
public SegmentSLLASKZ SegmentSLLASKZ { get; private set; }
2023-09-15 16:33:11 +02:00
/// <summary>
/// Das Segment enthält Angaben über den abzurechnenden Gesamtbruttobetrag eines Abrechnungsfalles (Verordnung)
/// (Summe aller ENF-Beträge ggf.zuzüglich der Mehrwertsteuer)
/// </summary>
public SegmentSLLABES SegmentSLLABES { get; private set; }
2023-10-31 14:46:11 +01:00
public decimal GesamtbetragBrutto => SegmentSLLABES.GesamtbetragBrutto.DecimalValue;
public decimal GesamtbetragEigenanteil => SegmentSLLABES.GesamtbetragEigenanteil.DecimalValue;
public decimal GesamtbetragGesetzlicheZuzahlung => SegmentSLLABES.GesamtbetragGesetzlicheZuzahlung.DecimalValue;
public decimal GesamtbetragProzentualeZuzahlung => SegmentSLLABES.GesamtbetragProzentualeZuzahlung.DecimalValue;
public decimal PauschalerZuzahlungsbetrag => SegmentSLLABES.PauschalerZuzahlungsbetrag.DecimalValue;
public BlockKlient()
2023-09-15 16:33:11 +02:00
{
SegmentSLLAINV = new SegmentSLLAINV();
SegmentSLLAURI = new SegmentSLLAURI();
SegmentSLLANAD = new SegmentSLLANAD();
SegmentSLLAIMG = new SegmentSLLAIMG();
BlockAbrechnungspositions = new List<BlockAbrechnungsposition>();
// wird nicht übermittelt
//SegmentSLLAZUZ = new SegmentSLLAZUZ();
2023-09-15 16:33:11 +02:00
SegmentSLLAZUV = new SegmentSLLAZUV();
BlockDiagnose = new List<BlockDiagnose>();
2023-09-15 16:33:11 +02:00
SegmentSLLASKZ = new SegmentSLLASKZ();
SegmentSLLABES = new SegmentSLLABES();
}
public override List<Segment> GetAllSegments()
2023-09-15 16:33:11 +02:00
{
var res = new List<Segment>();
res.Add(SegmentSLLAINV);
// res.Add(SegmentSLLAURI);
res.Add(SegmentSLLANAD);
foreach (var block in BlockAbrechnungspositions)
{
res.AddRange(block.GetSegments());
}
res.Add(SegmentSLLAZUV);
foreach (var block in BlockDiagnose)
{
res.AddRange(block.GetSegments());
}
res.Add(SegmentSLLASKZ);
res.Add(SegmentSLLABES);
return res;
2023-09-15 16:33:11 +02:00
}
public override int GetUNHCount() => 0;
public void Apply(InfoAbrechnungsfall info)
{
SegmentSLLAINV.VersichertenNummer.SetValue(info.VersichtertenNummer);
SegmentSLLAINV.Versichertenstatus.SetValue(info.Versichertenstatus);
SegmentSLLAINV.Beleginformation.SetValue(info.Beleginformation);
SegmentSLLAINV.Belegnummer.SetValue(info.Belegnummer);
// block.SegmentSLLAINV.KennzeichenBesondereVersorgungsform.SetValue(invoiceInfo.Kenn)
SegmentSLLANAD.Vorname.SetValue(info.VersichtertenVorname);
SegmentSLLANAD.Nachname.SetValue(info.VersichtertenNachname);
SegmentSLLANAD.Geburtsdatum.SetValue(info.VersichtertenGeburtstag);
SegmentSLLANAD.StraßeNr.SetValue(info.VersichtertenStraßeNr);
SegmentSLLANAD.PLZ.SetValue(info.VersichtertenPLZ);
SegmentSLLANAD.Wohnort.SetValue(info.VersichtertenWohnort);
SegmentSLLANAD.Länderkennzeichen.SetValue(info.VersichtertenLanderkennung);
foreach (var posinfo in info.InfosAbrechnungsposition.OrderBy(x => x.DatumDerLeistungserbringung))
{
var block = new BlockAbrechnungsposition();
block.Apply(posinfo);
BlockAbrechnungspositions.Add(block);
}
SegmentSLLAZUV.Betriebsstättennummer.SetValue(info.Betriebsstättennummer);
SegmentSLLAZUV.LebenslangeArztnummer.SetValue(info.LebenslangeArztnummer);
SegmentSLLAZUV.VerordnungsAusstellEinsatzdatum.SetValue(info.Verordnungsdatum);
SegmentSLLAZUV.Zuzahlungskennzeichen.SetValue(info.Zuzahlungskennzeichen);
SegmentSLLAZUV.Unfallkennzeichen.SetValue(info.Unfallkennzeichen);
SegmentSLLAZUV.KennzeichenBVGSonstiges.SetValue(info.KennzeichenBVGSonstiges);
SegmentSLLAZUV.KennzeichenVerordnungsbesonderheiten.SetValue(info.KennzeichenVerordnungsbesonderheiten);
if (info.DakotaInfoDiagnosen is object && info.DakotaInfoDiagnosen.Any())
{
foreach (var diagnose in info.DakotaInfoDiagnosen)
{
var block = new BlockDiagnose();
block.Apply(diagnose);
BlockDiagnose.Add(block);
}
}
SegmentSLLASKZ.Genehmigungskennzeichen.SetValue(info.Genehmigungskennzeichen);
SegmentSLLASKZ.DatumGenehmigung.SetValue(info.DatumDerGenehmigung);
SegmentSLLASKZ.ArtGenehmigung.SetValue(info.ArtDerGenehmigung);
2023-10-31 14:46:11 +01:00
CalculateSums();
}
private void CalculateSums()
{
2026-07-31 12:17:57 +02:00
var gesamtbrutto = BlockAbrechnungspositions.Sum(pos => Math.Round(pos.AnzahlEinheit * pos.EinzelbetragAbrechnungsposition, 2, MidpointRounding.AwayFromZero));
var gesamtproz = BlockAbrechnungspositions.Sum(pos => Math.Round(pos.AnzahlEinheit * pos.BetragZuzahlung, 2, MidpointRounding.AwayFromZero));
2023-10-31 14:46:11 +01:00
var diff = gesamtbrutto - gesamtproz;
2023-11-29 16:44:51 +01:00
var pauschaler = Math.Min(10, diff);
2023-10-31 14:46:11 +01:00
var gesamtgesetz = gesamtproz + pauschaler;
SegmentSLLABES.GesamtbetragBrutto.SetValue(gesamtbrutto);
2023-11-29 16:44:51 +01:00
// SegmentSLLABES.GesamtbetragGesetzlicheZuzahlung.SetValue(gesamtgesetz);
// SegmentSLLABES.GesamtbetragProzentualeZuzahlung.SetValue(gesamtproz);
// SegmentSLLABES.PauschalerZuzahlungsbetrag.SetValue(pauschaler);
// SegmentSLLABES.GesamtbetragEigenanteil.SetValue(0);
}
2023-09-15 16:33:11 +02:00
}
}