Datenannahmestelle Addresse

This commit is contained in:
2025-05-21 13:25:13 +02:00
parent b576125a21
commit 29c16af1da
24 changed files with 705 additions and 441 deletions

View File

@@ -82,12 +82,14 @@
<Compile Include="Models\Daten\Datenelementgruppe.cs" />
<Compile Include="Models\Infos\InfoParameterInvoiceItem.cs" />
<Compile Include="Models\IRowable.cs" />
<Compile Include="Models\KTDSummary.cs" />
<Compile Include="Models\Nachrichten\Nachricht.cs" />
<Compile Include="Models\Nachrichten\NachrichtKTD.cs" />
<Compile Include="Models\Nachrichten\NachrichtSLGA.cs" />
<Compile Include="Models\Nachrichten\NachrichtSLLA.cs" />
<Compile Include="Models\Schlüssels\Schlüssel.cs" />
<Compile Include="Models\Schlüssels\SchlüsselAbrechnungscode.cs" />
<Compile Include="Models\Schlüssels\SchlüsselArtDerAnschrift.cs" />
<Compile Include="Models\Schlüssels\SchlüsselArtDerGenehmigung.cs" />
<Compile Include="Models\Schlüssels\SchlüsselArtDerVerknüpfung.cs" />
<Compile Include="Models\Schlüssels\SchlüsselBVG.cs" />
@@ -108,6 +110,7 @@
<Compile Include="Models\Schlüssels\SchlüsselVerarbeitungskennzeichen.cs" />
<Compile Include="Models\Schlüssels\SchlüsselVerordnungsbesonderheiten.cs" />
<Compile Include="Models\Schlüssels\SchlüsselZuzahlung.cs" />
<Compile Include="Models\Segmente\KTD\SegmentKTDANS.cs" />
<Compile Include="Models\Segmente\KTD\SegmentKTD.cs" />
<Compile Include="Models\Segmente\KTD\SegmentKTDFKT.cs" />
<Compile Include="Models\Segmente\KTD\SegmentKTDIDK.cs" />

View File

@@ -1,4 +1,6 @@
using BS.Shared.Exceptions;
using BS.Shared.DataContracts;
using BS.Shared.DataContracts.Invoicing.GkvAbrechnung;
using BS.Shared.Exceptions;
using Dakota.Models;
using Dakota.Models.Nachrichten;
using Dakota.Models.Segmente.KTD;
@@ -12,173 +14,221 @@ using System.Threading.Tasks;
namespace Dakota.Logic
{
public class DakotaKTDReader
{
private static readonly string[] accept = new string[] { "UNH", "IDK", "FKT", "VKG", "UNT"};
public class DakotaKTDReader
{
private static readonly string[] accept = new string[] { "UNH", "IDK", "FKT", "VKG", "UNT", "ANS" };
internal Dictionary<string, Dictionary<string, NachrichtKTD>> FileDictionary { get; set; }
= new Dictionary<string, Dictionary<string, NachrichtKTD>>();
internal Dictionary<string, Dictionary<string, NachrichtKTD>> FileDictionary { get; set; }
= new Dictionary<string, Dictionary<string, NachrichtKTD>>();
public DakotaKTDReader(string ktd_folder_path)
{
var dir = new DirectoryInfo(ktd_folder_path);
public DakotaKTDReader(string ktd_folder_path)
{
var dir = new DirectoryInfo(ktd_folder_path);
var files = dir.GetFiles();
var files = dir.GetFiles();
foreach (var file in files)
{
var file_lines = File.ReadAllLines(file.FullName);
foreach (var file in files)
{
var file_lines = File.ReadAllLines(file.FullName);
foo(file.Name, file_lines);
}
}
foo(file.Name, file_lines);
}
}
public int GetFileCount() => FileDictionary.Count();
public int GetAllFileEntryCount() => FileDictionary.Sum(x => x.Value.Count);
public int GetFileCount() => FileDictionary.Count();
public int GetAllFileEntryCount() => FileDictionary.Sum(x => x.Value.Count);
/// <summary>
///
/// </summary>
/// <param name="ikkrankenkasse"></param>
/// <param name="abrechnungscode"></param>
/// <param name="tarifkennzeichen"></param>
/// <returns>Item1:Datenannahmestelle -
/// Item2:Kostenträger -
/// Item3:Krankenkasse</returns>
public Tuple<string, string, string, string> Resolve(string ikkrankenkasse, string abrechnungscode, string tarifkennzeichen)
{
foreach (var kv in FileDictionary)
{
var dict = kv.Value;
/// <summary>
///
/// </summary>
/// <param name="ikkrankenkasse"></param>
/// <param name="abrechnungscode"></param>
/// <param name="tarifkennzeichen"></param>
/// <returns>Item1:Datenannahmestelle -
/// Item2:Kostenträger -
/// Item3:Krankenkasse</returns>
public GkvKostentragerdateiSummary Resolve(string ikkrankenkasse, string abrechnungscode, string tarifkennzeichen)
{
foreach (var kv in FileDictionary)
{
var dict = kv.Value;
var search = GetIKNummern(dict, ikkrankenkasse, abrechnungscode, tarifkennzeichen);
var search = GetIKNummern(dict, ikkrankenkasse, abrechnungscode, tarifkennzeichen);
if (search is object)
if (search is object)
{
var datenannahmestelle = search.Item1;
var datenannahmestelle = search.Item1;
var nachricht = dict[datenannahmestelle];
var bez = dict[datenannahmestelle].SegmentIDK.Kurzbezeichnung;
var bez = nachricht.SegmentIDK.Kurzbezeichnung;
return new Tuple<string, string, string, string>(datenannahmestelle, search.Item2, search.Item3, bez);
}
}
var sum = new GkvKostentragerdateiSummary()
{
BezDatenannahmestelle = bez,
IKDatenannahmestelle = datenannahmestelle,
IKKostentrager = search.Item2,
IKKrankenkasse = search.Item3
};
return null;
}
foreach (var seg_ans in nachricht.SemgenteANS)
{
var address = GetAddress(seg_ans);
private Tuple<string, string, string> GetIKNummern(Dictionary<string, NachrichtKTD> dict, string ikkrankenkasse, string abrechnungscode, string tarifkennzeichen, string kostentrager = null)
{
if (kostentrager is null)
kostentrager = ikkrankenkasse;
if (seg_ans.ArtDerAnschrift == Models.Schlüssels.SchlüsselArtDerAnschrift.Großkundenanschrift)
{
sum.Großkundenanschrift = address;
}
else if(seg_ans.ArtDerAnschrift == Models.Schlüssels.SchlüsselArtDerAnschrift.Postfachanschrift)
{
sum.Postfachanschrift = address;
}
else if(seg_ans.ArtDerAnschrift == Models.Schlüssels.SchlüsselArtDerAnschrift.Hausanschrift)
{
sum.Hausanschrift = address;
}
else
{
throw new NotImplementedException();
}
}
var search = dict.SingleOrDefault(kv => kv.Key == kostentrager).Value;
return sum;
}
}
// Hat keinen Verweis auf eine KK gefunden
if (search is null)
return null;
return null;
}
var verweis = search.SegmentVKG.FirstOrDefault(x => x.ArtDerVerknüpfung == Models.Schlüssels.SchlüsselArtDerVerknüpfung.Kostentrager);
private Tuple<string, string, string> GetIKNummern(Dictionary<string, NachrichtKTD> dict, string ikkrankenkasse, string abrechnungscode, string tarifkennzeichen, string kostentrager = null)
{
if (kostentrager is null)
kostentrager = ikkrankenkasse;
// Hat Verweis auf weiteren Kostenträger gefunden
if (verweis is object && verweis.IKVerknüpfungspartners != kostentrager)
return GetIKNummern(dict, ikkrankenkasse, abrechnungscode, tarifkennzeichen, verweis.IKVerknüpfungspartners);
var search = dict.SingleOrDefault(kv => kv.Key == kostentrager).Value;
var datenannahmestellen = search.SegmentVKG
.Where(x => x.ArtDerVerknüpfung == Models.Schlüssels.SchlüsselArtDerVerknüpfung.DatenannahmestelleMitEntschlusselungsbefugnis)
.ToList();
// Hat keinen Verweis auf eine KK gefunden
if (search is null)
return null;
// Hat keinen Verweis auf Kostenträger oder Datenannahmestelle gefunden
if (datenannahmestellen is null || !datenannahmestellen.Any())
return null;
var verweis = search.SegmentVKG.FirstOrDefault(x => x.ArtDerVerknüpfung == Models.Schlüssels.SchlüsselArtDerVerknüpfung.Kostentrager);
if (datenannahmestellen.Count() == 1)
return GetIKNummern(datenannahmestellen.First(), kostentrager, ikkrankenkasse);
// Hat Verweis auf weiteren Kostenträger gefunden
if (verweis is object && verweis.IKVerknüpfungspartners != kostentrager)
return GetIKNummern(dict, ikkrankenkasse, abrechnungscode, tarifkennzeichen, verweis.IKVerknüpfungspartners);
// Abrechnungscode "69" <=> Sozio
var datenannahmestellen_2 = datenannahmestellen
.Where(x => x.Abrechnungscode == abrechnungscode)
.ToList();
var datenannahmestellen = search.SegmentVKG
.Where(x => x.ArtDerVerknüpfung == Models.Schlüssels.SchlüsselArtDerVerknüpfung.DatenannahmestelleMitEntschlusselungsbefugnis)
.ToList();
if (datenannahmestellen_2.Count() == 1)
return GetIKNummern(datenannahmestellen_2.First(), kostentrager, ikkrankenkasse);
// Hat keinen Verweis auf Kostenträger oder Datenannahmestelle gefunden
if (datenannahmestellen is null || !datenannahmestellen.Any())
return null;
// Tarifkennzeichen
var datenannahmestellen_3 = datenannahmestellen_2
.Where(x => x.Tarifkennzeichen == tarifkennzeichen)
.ToList();
if (datenannahmestellen.Count() == 1)
return GetIKNummern(datenannahmestellen.First(), kostentrager, ikkrankenkasse);
if (datenannahmestellen_3.Count() == 1)
return GetIKNummern(datenannahmestellen_3.First(), kostentrager, ikkrankenkasse);
// Abrechnungscode "69" <=> Sozio
var datenannahmestellen_2 = datenannahmestellen
.Where(x => x.Abrechnungscode == abrechnungscode)
.ToList();
// ArtDesÜbermittlungsmediums "1" <=> Datenfernübertragung
var filter_list = datenannahmestellen_3;
if (datenannahmestellen_2.Count() == 1)
return GetIKNummern(datenannahmestellen_2.First(), kostentrager, ikkrankenkasse);
if(!filter_list.Any())
filter_list = datenannahmestellen_2;
// Tarifkennzeichen
var datenannahmestellen_3 = datenannahmestellen_2
.Where(x => x.Tarifkennzeichen == tarifkennzeichen)
.ToList();
if (!filter_list.Any())
filter_list = datenannahmestellen;
if (datenannahmestellen_3.Count() == 1)
return GetIKNummern(datenannahmestellen_3.First(), kostentrager, ikkrankenkasse);
filter_list = filter_list
.Where(x => x.ArtDesÜbermittlungsmediums == "1")
.ToList();
// ArtDesÜbermittlungsmediums "1" <=> Datenfernübertragung
var filter_list = datenannahmestellen_3;
if (filter_list.Count() == 1)
return GetIKNummern(filter_list.First(), kostentrager, ikkrankenkasse);
if (!filter_list.Any())
filter_list = datenannahmestellen_2;
return null;
}
if (!filter_list.Any())
filter_list = datenannahmestellen;
private Tuple<string, string, string> GetIKNummern(SegmentKTDVKG vkg, string kostentrager, string ikkrankenkasse)
{
return new Tuple<string, string, string>(vkg.IKVerknüpfungspartners, kostentrager, ikkrankenkasse);
}
filter_list = filter_list
.Where(x => x.ArtDesÜbermittlungsmediums == "1")
.ToList();
private void foo(string filename, string[] lines)
{
var length = lines.Length;
var dict = new Dictionary<string, NachrichtKTD>();
if (filter_list.Count() == 1)
return GetIKNummern(filter_list.First(), kostentrager, ikkrankenkasse);
FileDictionary.Add(filename, dict);
return null;
}
Queue<string> queue = new Queue<string>();
int first_line = 0;
for (int i = 0; i < length; i++)
{
var line = lines[i];
private Tuple<string, string, string> GetIKNummern(SegmentKTDVKG vkg, string kostentrager, string ikkrankenkasse)
{
return new Tuple<string, string, string>(vkg.IKVerknüpfungspartners, kostentrager, ikkrankenkasse);
}
var type = GetType(line);
private AddressDC GetAddress(SegmentKTDANS segment)
{
var address = new AddressDC();
if (type is null)
continue;
address.Street = clear(segment.StraßeHausnummerOderPostfach);
address.Town = clear(segment.Ort);
address.PostalCode = clear(segment.Postleitzahl);
if (type == "UNH")
{
first_line = i;
}
else if (type == "UNT")
{
var nachricht = NachrichtKTD.Parse(queue.ToArray(), filename, first_line);
return address;
}
if (dict.ContainsKey(nachricht.IKNummer))
throw new Exception($"Beinhaltet Key bereits: {nachricht.IKNummer} in {filename} - l {first_line}");
private string clear(string str)
{
string asciiOnly = new string(str.Where(c => c <= 127).ToArray());
return asciiOnly;
}
dict.Add(nachricht.IKNummer, nachricht);
private void foo(string filename, string[] lines)
{
var length = lines.Length;
var dict = new Dictionary<string, NachrichtKTD>();
queue.Clear();
}
else
{
queue.Enqueue(line);
}
}
}
FileDictionary.Add(filename, dict);
private string GetType(string line)
{
var type = line.Substring(0, 3);
Queue<string> queue = new Queue<string>();
int first_line = 0;
for (int i = 0; i < length; i++)
{
var line = lines[i];
return accept.Contains(type) ? type : null;
}
}
var type = GetType(line);
if (type is null)
continue;
if (type == "UNH")
{
first_line = i;
}
else if (type == "UNT")
{
var nachricht = NachrichtKTD.Parse(queue.ToArray(), filename, first_line);
if (dict.ContainsKey(nachricht.IKNummer))
throw new Exception($"Beinhaltet Key bereits: {nachricht.IKNummer} in {filename} - l {first_line}");
dict.Add(nachricht.IKNummer, nachricht);
queue.Clear();
}
else
{
queue.Enqueue(line);
}
}
}
private string GetType(string line)
{
var type = line.Substring(0, 3);
return accept.Contains(type) ? type : null;
}
}
}

View File

@@ -0,0 +1,16 @@
using Dakota.Models.Nachrichten;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Dakota.Models
{
internal class KTDSummary
{
public NachrichtKTD Krankenkasse { get; set; }
public NachrichtKTD Kostenträger { get; set; }
public NachrichtKTD Datenannahmestelle { get; set; }
}
}

View File

@@ -1,42 +1,40 @@
using Dakota.Models.Segmente;
using System;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Dakota.Models.Segmente;
namespace Dakota.Models.Nachrichten
{
internal abstract class Nachricht : IRowable
{
public abstract List<Segment> GetAllSegments();
internal abstract class Nachricht : IRowable
{
public abstract List<Segment> GetAllSegments();
public List<Segment> GetSegments()
{
return GetAllSegments().Where(x => !x.ShouldSkip()).ToList();
}
public List<Segment> GetSegments()
{
return GetAllSegments().Where(x => !x.ShouldSkip()).ToList();
}
public int GetSegmentLength()
{
return GetSegments().Count + 2;
}
public int GetSegmentLength()
{
return GetSegments().Count + 2;
}
public string GetRows()
{
var segs = GetSegments();
var res = new List<string>();
public string GetRows()
{
var segs = GetSegments();
var res = new List<string>();
if (segs is null || !segs.Any())
return string.Empty;
if (segs is null || !segs.Any())
return string.Empty;
foreach (var seg in segs)
{
res.Add(seg.GetRow());
}
foreach (var seg in segs)
{
res.Add(seg.GetRow());
}
var str = string.Join(DakotaConfig.NewLine, res);
var str = string.Join(DakotaConfig.NewLine, res);
return str;
}
}
return str;
}
}
}

View File

@@ -1,73 +1,81 @@
using Dakota.Models.Segmente;
using Dakota.Models.Segmente.KTD;
using System;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Dakota.Models.Segmente;
using Dakota.Models.Segmente.KTD;
namespace Dakota.Models.Nachrichten
{
internal class NachrichtKTD : Nachricht
{
public string FileName { get; set; }
public int FirstLine { get; set; }
internal class NachrichtKTD : Nachricht
{
public string FileName { get; set; }
public int FirstLine { get; set; }
public SegmentKTDIDK SegmentIDK { get; set; }
public SegmentKTDFKT SegmentFKT { get; set; }
public List<SegmentKTDVKG> SegmentVKG { get; set; }
public SegmentKTDIDK SegmentIDK { get; set; }
public SegmentKTDFKT SegmentFKT { get; set; }
public List<SegmentKTDVKG> SegmentVKG { get; set; } = new List<SegmentKTDVKG>();
public List<SegmentKTDANS> SemgenteANS { get; set; } = new List<SegmentKTDANS>();
public NachrichtKTD()
{
SegmentVKG = new List<SegmentKTDVKG>();
}
public string IKNummer
{
get { return SegmentIDK.Institutionskennzeichen; }
}
public NachrichtKTD()
{
}
public string IKNummer
{
get { return SegmentIDK.Institutionskennzeichen; }
}
public override List<Segment> GetAllSegments()
{
throw new NotImplementedException();
}
public override List<Segment> GetAllSegments()
{
throw new NotImplementedException();
}
public static bool TryParse(string[] rows, string filename, int firstline, out NachrichtKTD nachricht)
{
nachricht = null;
public static bool TryParse(string[] rows, string filename, int firstline, out NachrichtKTD nachricht)
{
nachricht = null;
try
{
nachricht = Parse(rows, filename, firstline);
try
{
nachricht = Parse(rows, filename, firstline);
return true;
}
catch(Exception)
{
}
return true;
}
catch (Exception)
{
return false;
}
public static NachrichtKTD Parse(string[] rows, string filename, int firstline)
{
var nachricht = new NachrichtKTD();
}
nachricht.SegmentIDK = SegmentKTDIDK.Parse(rows[0]);
nachricht.SegmentFKT = SegmentKTDFKT.Parse(rows[1]);
return false;
}
public static NachrichtKTD Parse(string[] rows, string filename, int firstline)
{
var nachricht = new NachrichtKTD();
var length = rows.Length;
nachricht.SegmentIDK = SegmentKTDIDK.Parse(rows[0]);
nachricht.SegmentFKT = SegmentKTDFKT.Parse(rows[1]);
for (int i = 2; i < length; i++)
{
nachricht.SegmentVKG.Add(SegmentKTDVKG.Parse(rows[i]));
}
var length = rows.Length;
nachricht.FileName = filename;
nachricht.FirstLine = firstline;
for (int i = 2; i < length; i++)
{
var row = rows[i];
return nachricht;
}
}
if (row.StartsWith("VKG"))
{
nachricht.SegmentVKG.Add(SegmentKTDVKG.Parse(row));
}
else if (row.StartsWith("ANS"))
{
nachricht.SemgenteANS.Add(SegmentKTDANS.Parse(row));
}
}
nachricht.FileName = filename;
nachricht.FirstLine = firstline;
return nachricht;
}
}
}

View File

@@ -1,99 +1,97 @@
using Dakota.Models.Infos;
using Dakota.Models.Segmente;
using Dakota.Models.Segmente.SLGA;
using System;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Dakota.Models.Infos;
using Dakota.Models.Segmente;
using Dakota.Models.Segmente.SLGA;
namespace Dakota.Models.Nachrichten
{
/// <summary>
/// Gesamtaufstellung der
/// Abrechnung(Rechnung)
/// </summary>
internal class NachrichtSLGA : Nachricht
{
/// <summary>
/// Das Segment enthält Informationen über die zu verarbeitende Rechnung, den Rechnungssteller
/// (Leistungserbringer oder Abrechnungsstelle) und das IK der Krankenkasse von
/// der Krankenversichertenkarte bzw.von der ärztlichen Verordnung
/// </summary>
public SegmentSLGAFKT SegmentFKT { get; set; }
/// <summary>
/// Das Segment enthält die Rechnungsinformationen, wie Rechnungsnummer und Rechnungsdatum.
/// </summary>
public SegmentSLGAREC SegmentREC { get; set; }
/// <summary>
/// Das Segment enthält Informationen zur Umsatzsteuer.
/// </summary>
public SegmentSLGAUST SegmentUST { get; set; }
/// <summary>
/// Das Segment enthält Informationen, ob Skonto gewährt wird
/// (Skonto in Prozent, Zahlungsziel).
/// </summary>
public SegmentSLGASKO SegmentSKO { get; set; }
/// <summary>
/// Das Segment enthält Rechnungssummen (Bruttobetrag, Zuzahlungsbetrag, Nettobetrag je Status).
/// </summary>
public SegmentSLGAGES SegmentGES00 { get; set; }
/// <summary>
/// Das Segment enthält Rechnungssummen (Bruttobetrag, Zuzahlungsbetrag, Nettobetrag je Status).
/// </summary>
public List<SegmentSLGAGES> ListSegmentGES { get; set; }
/// <summary>
/// Das Segment enthält den Namen und die Firmenbezeichnung des Leistungserbringers
/// </summary>
public SegmentSLGANAM SegmentNAM { get; set; }
/// <summary>
/// Gesamtaufstellung der
/// Abrechnung(Rechnung)
/// </summary>
internal class NachrichtSLGA : Nachricht
{
/// <summary>
/// Das Segment enthält Informationen über die zu verarbeitende Rechnung, den Rechnungssteller
/// (Leistungserbringer oder Abrechnungsstelle) und das IK der Krankenkasse von
/// der Krankenversichertenkarte bzw.von der ärztlichen Verordnung
/// </summary>
public SegmentSLGAFKT SegmentFKT { get; set; }
/// <summary>
/// Das Segment enthält die Rechnungsinformationen, wie Rechnungsnummer und Rechnungsdatum.
/// </summary>
public SegmentSLGAREC SegmentREC { get; set; }
/// <summary>
/// Das Segment enthält Informationen zur Umsatzsteuer.
/// </summary>
public SegmentSLGAUST SegmentUST { get; set; }
/// <summary>
/// Das Segment enthält Informationen, ob Skonto gewährt wird
/// (Skonto in Prozent, Zahlungsziel).
/// </summary>
public SegmentSLGASKO SegmentSKO { get; set; }
/// <summary>
/// Das Segment enthält Rechnungssummen (Bruttobetrag, Zuzahlungsbetrag, Nettobetrag je Status).
/// </summary>
public SegmentSLGAGES SegmentGES00 { get; set; }
/// <summary>
/// Das Segment enthält Rechnungssummen (Bruttobetrag, Zuzahlungsbetrag, Nettobetrag je Status).
/// </summary>
public List<SegmentSLGAGES> ListSegmentGES { get; set; }
/// <summary>
/// Das Segment enthält den Namen und die Firmenbezeichnung des Leistungserbringers
/// </summary>
public SegmentSLGANAM SegmentNAM { get; set; }
public NachrichtSLGA()
{
SegmentFKT = new SegmentSLGAFKT();
SegmentREC = new SegmentSLGAREC();
SegmentUST = new SegmentSLGAUST();
SegmentSKO = new SegmentSLGASKO();
SegmentGES00 = new SegmentSLGAGES();
ListSegmentGES = new List<SegmentSLGAGES>();
SegmentNAM = new SegmentSLGANAM();
}
public NachrichtSLGA()
{
SegmentFKT = new SegmentSLGAFKT();
SegmentREC = new SegmentSLGAREC();
SegmentUST = new SegmentSLGAUST();
SegmentSKO = new SegmentSLGASKO();
SegmentGES00 = new SegmentSLGAGES();
ListSegmentGES = new List<SegmentSLGAGES>();
SegmentNAM = new SegmentSLGANAM();
}
public override List<Segment> GetAllSegments()
{
var res = new List<Segment>();
public override List<Segment> GetAllSegments()
{
var res = new List<Segment>();
res.Add(SegmentFKT);
res.Add(SegmentREC);
res.Add(SegmentUST);
res.Add(SegmentSKO);
res.Add(SegmentGES00);
res.AddRange(ListSegmentGES);
res.Add(SegmentNAM);
res.Add(SegmentFKT);
res.Add(SegmentREC);
res.Add(SegmentUST);
res.Add(SegmentSKO);
res.Add(SegmentGES00);
res.AddRange(ListSegmentGES);
res.Add(SegmentNAM);
return res;
}
return res;
}
public void Apply(InfoNachrichtSLGA info, bool isSammelrechnung)
{
SegmentFKT.Verarbeitungskennzeichen.SetValue(info.Verarbeitungskennzeichen);
if(isSammelrechnung)
SegmentFKT.Sammelrechnung.SetValue("J");
public void Apply(InfoNachrichtSLGA info, bool isSammelrechnung)
{
SegmentFKT.Verarbeitungskennzeichen.SetValue(info.Verarbeitungskennzeichen);
SegmentFKT.IKLeistungserbringers.SetValue(info.IKLeistungserbringer);
SegmentFKT.IKKostenträger.SetValue(info.IKKostentrager);
SegmentFKT.IKVersichertenKarte.SetValue(info.IKKrankenkasse);
SegmentFKT.IKAbsender.SetValue(info.IKAbsender);
if (isSammelrechnung)
SegmentFKT.Sammelrechnung.SetValue("J");
SegmentREC.SammelRechnungsnummer.SetValue(info.Rechnungsnummer);
SegmentREC.EinzelRechnungsnummer.SetValue("0");
SegmentREC.Rechnungsdatum.SetValue(info.Rechnungsdatum);
SegmentREC.Rechnungsart.SetValue(info.Rechnungsart);
SegmentFKT.IKLeistungserbringers.SetValue(info.IKLeistungserbringer);
SegmentFKT.IKKostenträger.SetValue(info.IKKostentrager);
SegmentFKT.IKVersichertenKarte.SetValue(info.IKKrankenkasse);
SegmentFKT.IKAbsender.SetValue(info.IKAbsender);
SegmentNAM.Name1.SetValue(info.Name1);
SegmentNAM.Name2.SetValue(info.Name2);
SegmentNAM.Name3.SetValue(info.Name3);
SegmentNAM.Name4.SetValue(info.Name4);
}
}
SegmentREC.SammelRechnungsnummer.SetValue(info.Rechnungsnummer);
SegmentREC.EinzelRechnungsnummer.SetValue("0");
SegmentREC.Rechnungsdatum.SetValue(info.Rechnungsdatum);
SegmentREC.Rechnungsart.SetValue(info.Rechnungsart);
SegmentNAM.Name1.SetValue(info.Name1);
SegmentNAM.Name2.SetValue(info.Name2);
SegmentNAM.Name3.SetValue(info.Name3);
SegmentNAM.Name4.SetValue(info.Name4);
}
}
}

View File

@@ -1,82 +1,80 @@
using Dakota.Models.Blocke;
using System;
using System.Collections.Generic;
using System.Linq;
using Dakota.Models.Blocke;
using Dakota.Models.Infos;
using Dakota.Models.Segmente;
using Dakota.Models.Segmente.SLLA;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Dakota.Models.Nachrichten
{
/// <summary>
/// Leistungserbringer
/// </summary>
internal class NachrichtSLLA : Nachricht
{
/// <summary>
/// Das Segment enthält Informationen über den tatsächlichen
/// Leistungserbringer und das IK der Krankenkasse von der
/// Krankenversichertenkarte bzw.der ärztlichen Verordnung bezogen auf die folgenden Abrechnungsfälle.Es kommt je Nachricht nur einmal vor.
/// </summary>
public SegmentSLLAFKT SegmentSLLAFKT { get; private set; }
/// <summary>
/// Das Segment enthält die Rechnungsinformationen, wie Rechnungsnummer und Rechnungsdatum
/// </summary>
public SegmentSLLAREC SegmentSLLAREC { get; private set; }
/// <summary>
/// Abrechnungsfälle (INV - BES)
/// </summary>
public List<BlockKlient> BlockKlienten { get; set; }
/// <summary>
/// Leistungserbringer
/// </summary>
internal class NachrichtSLLA : Nachricht
{
/// <summary>
/// Das Segment enthält Informationen über den tatsächlichen
/// Leistungserbringer und das IK der Krankenkasse von der
/// Krankenversichertenkarte bzw.der ärztlichen Verordnung bezogen auf die folgenden Abrechnungsfälle.Es kommt je Nachricht nur einmal vor.
/// </summary>
public SegmentSLLAFKT SegmentSLLAFKT { get; private set; }
/// <summary>
/// Das Segment enthält die Rechnungsinformationen, wie Rechnungsnummer und Rechnungsdatum
/// </summary>
public SegmentSLLAREC SegmentSLLAREC { get; private set; }
/// <summary>
/// Abrechnungsfälle (INV - BES)
/// </summary>
public List<BlockKlient> BlockKlienten { get; set; }
public NachrichtSLLA()
{
SegmentSLLAFKT = new SegmentSLLAFKT();
SegmentSLLAREC = new SegmentSLLAREC();
public NachrichtSLLA()
{
SegmentSLLAFKT = new SegmentSLLAFKT();
SegmentSLLAREC = new SegmentSLLAREC();
BlockKlienten = new List<BlockKlient>();
}
BlockKlienten = new List<BlockKlient>();
}
public override List<Segment> GetAllSegments()
{
var list = new List<Segment>() { SegmentSLLAFKT, SegmentSLLAREC };
public override List<Segment> GetAllSegments()
{
var list = new List<Segment>() { SegmentSLLAFKT, SegmentSLLAREC };
foreach (var block in BlockKlienten)
{
list.AddRange(block.GetSegments());
}
foreach (var block in BlockKlienten)
{
list.AddRange(block.GetSegments());
}
return list;
}
return list;
}
public void Add(BlockKlient fall)
{
BlockKlienten.Add(fall);
}
public void Apply(InfoNachrichtSLLA info)
{
SegmentSLLAFKT.Verarbeitungskennzeichen.SetValue(info.Verarbeitungskennzeichen);
SegmentSLLAFKT.IKLeistungserbringers.SetValue(info.IKLeistungserbringer);
SegmentSLLAFKT.IKKostenträgers.SetValue(info.IKKostentrager);
SegmentSLLAFKT.IKKrankenkasse.SetValue(info.IKKrankenkasse);
//SegmentSLLAFKT.IKRechnungsstellers.SetValue(info.IKAbsender);
public void Add(BlockKlient fall)
{
BlockKlienten.Add(fall);
}
public void Apply(InfoNachrichtSLLA info)
{
SegmentSLLAFKT.Verarbeitungskennzeichen.SetValue(info.Verarbeitungskennzeichen);
SegmentSLLAFKT.IKLeistungserbringers.SetValue(info.IKLeistungserbringer);
SegmentSLLAFKT.IKKostenträgers.SetValue(info.IKKostentrager);
SegmentSLLAFKT.IKKrankenkasse.SetValue(info.IKKrankenkasse);
//SegmentSLLAFKT.IKRechnungsstellers.SetValue(info.IKAbsender);
foreach (var infofall in info.Abrechnungsfalle.OrderBy(x => x.InfosAbrechnungsposition.Min(y => y.DatumDerLeistungserbringung)))
{
var block = new BlockKlient();
foreach (var infofall in info.Abrechnungsfalle.OrderBy(x => x.InfosAbrechnungsposition.Min(y => y.DatumDerLeistungserbringung)))
{
var block = new BlockKlient();
block.Apply(infofall);
block.Apply(infofall);
Add(block);
}
Add(block);
}
SegmentSLLAREC.SammelRechnungsnummer.SetValue(info.Rechnungsnummer);
SegmentSLLAREC.EinzelRechnungsnummer.SetValue("0");
SegmentSLLAREC.Rechnungsdatum.SetValue(info.Rechnungsdatum);
SegmentSLLAREC.Rechnungsart.SetValue(info.Rechnungsart);
}
}
SegmentSLLAREC.SammelRechnungsnummer.SetValue(info.Rechnungsnummer);
SegmentSLLAREC.EinzelRechnungsnummer.SetValue("0");
SegmentSLLAREC.Rechnungsdatum.SetValue(info.Rechnungsdatum);
SegmentSLLAREC.Rechnungsart.SetValue(info.Rechnungsart);
}
}
}

View File

@@ -0,0 +1,29 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Dakota.Models.Schlüssels
{
public class SchlüsselArtDerAnschrift : Schlüssel
{
public SchlüsselArtDerAnschrift(string val) : base(val) { }
public static SchlüsselArtDerAnschrift Hausanschrift => new SchlüsselArtDerAnschrift("1");
public static SchlüsselArtDerAnschrift Postfachanschrift => new SchlüsselArtDerAnschrift("2");
public static SchlüsselArtDerAnschrift Großkundenanschrift => new SchlüsselArtDerAnschrift("3");
public static SchlüsselArtDerAnschrift Parse(string str)
{
var list = new SchlüsselArtDerAnschrift[] {
Hausanschrift ,
Postfachanschrift ,
Großkundenanschrift};
var schlüssel = GetSchlüssel(list, str);
return schlüssel;
}
}
}

View File

@@ -0,0 +1,37 @@
using Dakota.Models.Schlüssels;
using System;
using System.Diagnostics;
namespace Dakota.Models.Segmente.KTD
{
[DebuggerDisplay("ANS+{Verarbeitungskennzeichen.Value}'")]
internal class SegmentKTDANS : SegmentKTD
{
public SchlüsselArtDerAnschrift ArtDerAnschrift { get; set; }
public string Postleitzahl { get; set; }
public string Ort { get; set; }
public string StraßeHausnummerOderPostfach { get; set; }
public static SegmentKTDANS Parse(string row)
{
var segment = new SegmentKTDANS();
var split = row.Trim(Segmentendezeichen).Split(Trennzeichen);
segment.ArtDerAnschrift = SchlüsselArtDerAnschrift.Parse(split[1]);
segment.Postleitzahl = split[2];
if (split.Length <= 3)
return segment;
segment.Ort = split[3];
if (split.Length <= 4)
return segment;
segment.StraßeHausnummerOderPostfach = split[4];
return segment;
}
}
}