147 lines
5.9 KiB
C#
147 lines
5.9 KiB
C#
using Dakota.Models.Infos;
|
||
using Dakota.Models.Segmente;
|
||
using Dakota.Models.Segmente.SLLA;
|
||
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 => p.AnzahlEinheit * p.EinzelbetragAbrechnungsposition);
|
||
|
||
SegmentSLLABES.GesamtbetragBrutto.SetValue(gesamtbrutto);
|
||
}
|
||
}
|
||
}
|