Datenannahmestelle Addresse
This commit is contained in:
@@ -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" />
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
16
Dakota/Models/KTDSummary.cs
Normal file
16
Dakota/Models/KTDSummary.cs
Normal 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; }
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
29
Dakota/Models/Schlüssels/SchlüsselArtDerAnschrift.cs
Normal file
29
Dakota/Models/Schlüssels/SchlüsselArtDerAnschrift.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
37
Dakota/Models/Segmente/KTD/SegmentKTDANS.cs
Normal file
37
Dakota/Models/Segmente/KTD/SegmentKTDANS.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user