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

148 lines
6.0 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using Dakota.Models.Infos;
using Dakota.Models.Segmente;
using Dakota.Models.Segmente.SLLA;
using System;
using System.Collections.Generic;
using System.Linq;
namespace Dakota.Models.Blocke
{
/// <summary>
/// Abrechnungsfall (INV … BES) für Häusliche Krankenpflege (SLLA: C).
/// Segmentfolge gem. TA § 302 Abs. 5.5.3.4:
/// INV, NAD, [IMG], ESK { EHK [ELP] [TXT] }+, ZHK [DIA] SKZ BES
/// </summary>
internal class BlockKlientHKP : Block
{
public SegmentSLLAINV SegmentSLLAINV { get; private set; }
public SegmentSLLANAD SegmentSLLANAD { get; private set; }
public SegmentSLLAIMG SegmentSLLAIMG { get; private set; }
/// <summary>Ein BlockEinsatz pro Einsatz/Hausbesuch (ESK + EHK-Positionen).</summary>
public List<BlockEinsatz> BlockEinsätze { get; private set; }
/// <summary>
/// ZHK Zusatzinfo Verordnung HK.
/// Laut TA 1-n je INV (eine je Verordnung); hier zunächst eine Verordnung pro Fall.
/// </summary>
public SegmentSLLAZHK SegmentSLLAZHK { get; private set; }
public List<BlockDiagnose> BlockDiagnose { get; private set; }
/// <summary>
/// SKZ ist bei C Pflicht (1-n je ZHK, laut TA zwingend zu übermitteln).
/// Liegen mehrere Kostenzusagen vor, ist das Segment zu wiederholen
/// hier wird zunächst eine Kostenzusage je Fall unterstützt.
/// </summary>
public SegmentSLLASKZ SegmentSLLASKZ { get; private set; }
public SegmentSLLABES SegmentSLLABES { get; private set; }
// Summen-Zugriff für NachrichtSLLA / SLGA
public decimal GesamtbetragBrutto => SegmentSLLABES.GesamtbetragBrutto.DecimalValue;
public BlockKlientHKP()
{
SegmentSLLAINV = new SegmentSLLAINV();
SegmentSLLANAD = new SegmentSLLANAD();
SegmentSLLAIMG = new SegmentSLLAIMG();
BlockEinsätze = new List<BlockEinsatz>();
SegmentSLLAZHK = new SegmentSLLAZHK();
BlockDiagnose = new List<BlockDiagnose>();
SegmentSLLASKZ = new SegmentSLLASKZ();
SegmentSLLABES = new SegmentSLLABES();
}
public override List<Segment> GetAllSegments()
{
var res = new List<Segment>();
res.Add(SegmentSLLAINV);
res.Add(SegmentSLLANAD);
// IMG nur wenn befüllt wie in BlockKlient gehandhabt
foreach (var einsatz in BlockEinsätze)
res.AddRange(einsatz.GetSegments());
res.Add(SegmentSLLAZHK);
foreach (var dia in BlockDiagnose)
res.AddRange(dia.GetSegments());
res.Add(SegmentSLLASKZ);
res.Add(SegmentSLLABES);
return res;
}
public override int GetUNHCount() => 0;
public void Apply(InfoAbrechnungsfall info)
{
// INV
SegmentSLLAINV.VersichertenNummer.SetValue(info.VersichtertenNummer);
SegmentSLLAINV.Versichertenstatus.SetValue(info.Versichertenstatus);
SegmentSLLAINV.Beleginformation.SetValue(info.Beleginformation);
SegmentSLLAINV.Belegnummer.SetValue(info.Belegnummer);
// NAD
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);
// ESK + EHK: je Abrechnungsposition ein eigener Einsatz
// (ein InvoiceItem = ein Einsatz; mehrere Positionen am selben Tag
// können durch den Aufrufer in einem BlockEinsatz zusammengefasst werden)
foreach (var posinfo in info.InfosAbrechnungsposition
.OrderBy(x => x.DatumDerLeistungserbringung))
{
var einsatz = new BlockEinsatz();
einsatz.Apply(posinfo);
BlockEinsätze.Add(einsatz);
}
// ZHK
SegmentSLLAZHK.Betriebsstättennummer.SetValue(
string.IsNullOrWhiteSpace(info.Betriebsstättennummer) ? "999999999" : info.Betriebsstättennummer);
SegmentSLLAZHK.LebenslangeArztnummer.SetValue(
string.IsNullOrWhiteSpace(info.LebenslangeArztnummer) ? "999999999" : info.LebenslangeArztnummer);
SegmentSLLAZHK.Verordnungsdatum.SetValue(info.Verordnungsdatum);
SegmentSLLAZHK.Unfallkennzeichen.SetValue(info.Unfallkennzeichen);
SegmentSLLAZHK.KennzeichenBVGSonstiges.SetValue(info.KennzeichenBVGSonstiges);
SegmentSLLAZHK.KennzeichenVerordnungsbesonderheiten.SetValue(info.KennzeichenVerordnungsbesonderheiten);
// DIA
if (info.DakotaInfoDiagnosen?.Any() == true)
{
foreach (var diagnose in info.DakotaInfoDiagnosen)
{
var block = new BlockDiagnose();
block.Apply(diagnose);
BlockDiagnose.Add(block);
}
}
// SKZ
SegmentSLLASKZ.Genehmigungskennzeichen.SetValue(info.Genehmigungskennzeichen);
SegmentSLLASKZ.DatumGenehmigung.SetValue(info.DatumDerGenehmigung);
SegmentSLLASKZ.ArtGenehmigung.SetValue(info.ArtDerGenehmigung);
// BES
CalculateSums();
}
private void CalculateSums()
{
var gesamtbrutto = BlockEinsätze
.SelectMany(e => e.Positionen)
.Sum(p => Math.Round(p.AnzahlEinheit * p.EinzelbetragAbrechnungsposition, 2, MidpointRounding.AwayFromZero));
SegmentSLLABES.GesamtbetragBrutto.SetValue(gesamtbrutto);
}
}
}