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

@@ -67,7 +67,7 @@
<CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
<UseVSHostingProcess>true</UseVSHostingProcess>
<Prefer32Bit>false</Prefer32Bit>
<NoWarn>CS0659, CS0162, CS0168, CS0649, CS0219, CS0169, CS0414, CS0067</NoWarn>
<NoWarn>CS0659, CS0162, CS0168, CS0649, CS0219, CS0169, CS0414, CS0067, CS0618</NoWarn>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
@@ -95,6 +95,7 @@
</StartupObject>
</PropertyGroup>
<ItemGroup>
<Compile Include="Converter\AddressToStringConverter.cs" />
<Compile Include="Converter\Features\AiConversationMessageSystemConverter.cs" />
<Compile Include="Converter\NewlineConverter.cs" />
<Compile Include="ServiceProxy\GeneratedAiEnhancedService.cs" />

View File

@@ -83,6 +83,7 @@
<conv:EnumTranslationConverter x:Key="EnumTranslationConverter" />
<conv:TooltipTextConverter x:Key="TooltipTextConverter" />
<conv:NewlineConverter x:Key="NewlineConverter" />
<conv:AddressToStringConverter x:Key="AddressToStringConverter" />
<conv:ValidationConverter x:Key="ValidationConverter" />
<conv:ValueConverterGroup x:Key="Validation2BrushConverter">

View File

@@ -0,0 +1,29 @@
using BeWo.ViewModel;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Data;
namespace BeWo.Converter
{
public class AddressToStringConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var vm = value as AddressVM;
if (vm is null)
return null;
return vm.ToSingleLine();
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
}

View File

@@ -590,7 +590,7 @@
Width="10*"
MinWidth="50"
MaxWidth="200" />
<ColumnDefinition Width="*" MinWidth="50" />
<ColumnDefinition Width="*" MinWidth="100" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition
Width="10*"
@@ -636,11 +636,17 @@
Grid.Row="0"
Grid.RowSpan="2"
Grid.Column="2"
Height="auto"
Margin="10,3,10,3"
VerticalAlignment="Center"
Click="button_ik_ermitteln_click"
IsEnabled="{Binding IsIKNumberValid}"
Style="{StaticResource PrimaryButtonSmall}"
Visibility="{Binding Converter={StaticResource UserPermission2VisibleConverter}, ConverterParameter={x:Static core:SettingsKeys.AllowGkvAbrechnung}}">
>>>
<TextBlock Margin="3" TextAlignment="Center">
Datenannahemstelle<LineBreak/>
ermitteln >>>
</TextBlock>
</Button>
@@ -730,11 +736,8 @@
x:Name="txt_hausanschrift"
Grid.Row="1"
Grid.Column="4"
Foreground="{Binding Path=IKDatenannahmestelle, Converter={StaticResource Validation2BrushConverter}, ConverterParameter={x:Static shared:ValidationType.OrganisationBezDatenannahmestelle}}"
IsEnabled="False"
Text="{Binding Path=IKDatenannahmestelle, UpdateSourceTrigger=PropertyChanged}"
ToolTip="{Binding Path=IKDatenannahmestelle, Converter={StaticResource Validation2TooltipConverter}, ConverterParameter={x:Static shared:ValidationType.OrganisationBezDatenannahmestelle}}"
ToolTipService.ShowOnDisabled="True"
Text="{Binding Path=HausanschriftDatenannahmestelle, Converter={StaticResource AddressToStringConverter}, UpdateSourceTrigger=PropertyChanged, Mode=OneWay}"
Visibility="{Binding Converter={StaticResource UserPermission2VisibleConverter}, ConverterParameter={x:Static core:SettingsKeys.AllowGkvAbrechnung}}" />
<Label
@@ -749,11 +752,8 @@
x:Name="txt_postfachanschrift"
Grid.Row="2"
Grid.Column="4"
Foreground="{Binding Path=IKDatenannahmestelle, Converter={StaticResource Validation2BrushConverter}, ConverterParameter={x:Static shared:ValidationType.OrganisationBezDatenannahmestelle}}"
IsEnabled="False"
Text="{Binding Path=IKDatenannahmestelle, UpdateSourceTrigger=PropertyChanged}"
ToolTip="{Binding Path=IKDatenannahmestelle, Converter={StaticResource Validation2TooltipConverter}, ConverterParameter={x:Static shared:ValidationType.OrganisationBezDatenannahmestelle}}"
ToolTipService.ShowOnDisabled="True"
Text="{Binding Path=PostfachanschriftDatenannahmestelle, Converter={StaticResource AddressToStringConverter}, UpdateSourceTrigger=PropertyChanged, Mode=OneWay}"
Visibility="{Binding Converter={StaticResource UserPermission2VisibleConverter}, ConverterParameter={x:Static core:SettingsKeys.AllowGkvAbrechnung}}" />
<Label
@@ -768,11 +768,8 @@
x:Name="txt_großkundenanschrift"
Grid.Row="3"
Grid.Column="4"
Foreground="{Binding Path=IKDatenannahmestelle, Converter={StaticResource Validation2BrushConverter}, ConverterParameter={x:Static shared:ValidationType.OrganisationBezDatenannahmestelle}}"
IsEnabled="False"
Text="{Binding Path=IKDatenannahmestelle, UpdateSourceTrigger=PropertyChanged}"
ToolTip="{Binding Path=IKDatenannahmestelle, Converter={StaticResource Validation2TooltipConverter}, ConverterParameter={x:Static shared:ValidationType.OrganisationBezDatenannahmestelle}}"
ToolTipService.ShowOnDisabled="True"
Text="{Binding Path=GroßkundenanschriftDatenannahmestelle, Converter={StaticResource AddressToStringConverter}, UpdateSourceTrigger=PropertyChanged, Mode=OneWay}"
Visibility="{Binding Converter={StaticResource UserPermission2VisibleConverter}, ConverterParameter={x:Static core:SettingsKeys.AllowGkvAbrechnung}}" />
<Label

View File

@@ -361,9 +361,7 @@ namespace BeWo.View.Detail
return;
}
ViewModel.BezDatenannahmestelle = response.BezDatenannahmestelle;
ViewModel.IKKostentrager = response.IKKostentrager;
ViewModel.IKDatenannahmestelle = response.IKDatenannahmestelle;
ViewModel.UpdateByGetIKResponse(response);
CommandManager.InvalidateRequerySuggested();
}

View File

@@ -3,6 +3,7 @@
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:controls="clr-namespace:BeWo.View.Controls"
xmlns:doc="clr-namespace:BeWo.View.Document"
xmlns:dx="http://schemas.devexpress.com/winfx/2008/xaml/core"
xmlns:dxa="http://schemas.devexpress.com/winfx/2008/xaml/accordion"
xmlns:dxe="http://schemas.devexpress.com/winfx/2008/xaml/editors"
@@ -12,7 +13,6 @@
xmlns:localView="clr-namespace:BeWo.View"
xmlns:markup="clr-namespace:BeWo.MultiLanguage.Markup"
xmlns:master="clr-namespace:BeWo.View.Master"
xmlns:doc="clr-namespace:BeWo.View.Document"
xmlns:uc="clr-namespace:BeWo.Controls;assembly=BeWo.Controls"
Width="Auto"
Height="Auto"
@@ -516,11 +516,22 @@
dx:ThemeManager.ThemeName="Office2010Black"
DefaultSorting="Name">
<dxg:TreeListControl.Columns>
<dxg:TreeListColumn AllowSorting="True" FieldName="Name" AllowEditing="False">
<dxg:TreeListColumn
AllowEditing="False"
AllowSorting="True"
FieldName="Name">
<dxg:TreeListColumn.CellTemplate>
<DataTemplate>
<dxe:TextEdit x:Name="PART_Editor" EditMode="InplaceActive" Text="{Binding Path=DataContext.RowData.Row.Name, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}, UpdateSourceTrigger=PropertyChanged}"
AcceptsReturn="False" AcceptsTab="False" TextTrimming="WordEllipsis" TextWrapping="NoWrap" SelectAllOnGotFocus="True" SelectAllOnMouseUp="True" />
<dxe:TextEdit
x:Name="PART_Editor"
AcceptsReturn="False"
AcceptsTab="False"
EditMode="InplaceActive"
SelectAllOnGotFocus="True"
SelectAllOnMouseUp="True"
Text="{Binding Path=DataContext.RowData.Row.Name, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}, UpdateSourceTrigger=PropertyChanged}"
TextTrimming="WordEllipsis"
TextWrapping="NoWrap" />
</DataTemplate>
</dxg:TreeListColumn.CellTemplate>
</dxg:TreeListColumn>
@@ -529,12 +540,14 @@
<dxg:TreeListView
x:Name="TemplateTreeView"
AllowEditing="True"
AutoExpandOnDrag="True"
AutoWidth="True"
ContextMenu="{StaticResource templatecm}"
FocusedRowChanged="TemplateTreeView_FocusedRowChanged"
HorizontalScrollbarVisibility="Auto"
KeyFieldName="{Binding DocumentTreeItemVM.DocTreeItemOid}"
LostFocus="TemplateTreeView_LostFocus"
NavigationStyle="Cell"
NodeExpanding="templateTreeListView_NodeExpanding"
ParentFieldName="Binding DocumentTreeItemVM.ParentOid"
PreviewMouseLeftButtonDown="TemplateTreeView_PreviewMouseButtonDown"
@@ -545,10 +558,8 @@
ShowIndicator="False"
ShowNodeImages="True"
ShowVerticalLines="False"
VerticalScrollbarVisibility="Auto"
AutoExpandOnDrag="True"
NavigationStyle="Cell"
ShownEditor="TemplateTreeView_ShownEditor" />
ShownEditor="TemplateTreeView_ShownEditor"
VerticalScrollbarVisibility="Auto" />
</dxg:TreeListControl.View>
</dxg:TreeListControl>
<!--
@@ -619,11 +630,11 @@
</dxlc:LayoutGroup>
<dxlc:LayoutGroup dxlc:LayoutControl.AllowHorizontalSizing="True">
<GroupBox
x:Name="GroupBoxTemplateList"
Grid.ColumnSpan="2"
Padding="5"
Header=""
Style="{StaticResource ObjectEditGroupBox}">
x:Name="GroupBoxTemplateList"
Grid.ColumnSpan="2"
Padding="5"
Header=""
Style="{StaticResource ObjectEditGroupBox}">
<Grid>
<Grid.ColumnDefinitions>
@@ -634,54 +645,54 @@
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<dxg:GridControl
x:Name="datagrid_templates"
Grid.Row="0"
Grid.Column="1"
Margin="2,3,5,5">
x:Name="datagrid_templates"
Grid.Row="0"
Grid.Column="1"
Margin="2,3,5,5">
<dxg:GridControl.Columns>
<dxg:GridColumn
Width="24"
FieldName="FileName"
FixedWidth="True"
Header=""
ReadOnly="True">
Width="24"
FieldName="FileName"
FixedWidth="True"
Header=""
ReadOnly="True">
<dxg:GridColumn.CellTemplate>
<DataTemplate>
<Button
Width="20"
Height="20"
Margin="1"
VerticalAlignment="Center"
Click="TemplateDeleteButton_Click"
Content="r"
FontFamily="Webdings" />
Width="20"
Height="20"
Margin="1"
VerticalAlignment="Center"
Click="TemplateDeleteButton_Click"
Content="r"
FontFamily="Webdings" />
</DataTemplate>
</dxg:GridColumn.CellTemplate>
</dxg:GridColumn>
<dxg:GridColumn
Width="*"
AllowEditing="False"
FieldName="Name"
Header="Name" />
Width="*"
AllowEditing="False"
FieldName="Name"
Header="Name" />
<dxg:GridColumn
Width="*"
AllowEditing="False"
FieldName="Beschreibung"
Header="Beschreibung" />
Width="*"
AllowEditing="False"
FieldName="Beschreibung"
Header="Beschreibung" />
<dxg:GridColumn
Width="80"
FieldName="FileEdit"
FixedWidth="True"
Header=""
ReadOnly="True">
Width="80"
FieldName="FileEdit"
FixedWidth="True"
Header=""
ReadOnly="True">
<dxg:GridColumn.CellTemplate>
<DataTemplate>
<Button
Width="75"
Height="23"
VerticalAlignment="Center"
Click="EditTemplate_Click"
Content="Bearbeiten" />
Width="75"
Height="23"
VerticalAlignment="Center"
Click="EditTemplate_Click"
Content="Bearbeiten" />
</DataTemplate>
</dxg:GridColumn.CellTemplate>
</dxg:GridColumn>
@@ -705,13 +716,13 @@
</dxg:GridControl.Columns>
<dxg:GridControl.View>
<dxg:TableView
x:Name="TemplateTableView"
AutoWidth="false"
NavigationStyle="Row"
ShowGroupPanel="False"
ShowGroupedColumns="false"
ShowTotalSummary="False"
RowDoubleClick="TemplateTableView_RowDoubleClick"/>
x:Name="TemplateTableView"
AutoWidth="false"
NavigationStyle="Row"
RowDoubleClick="TemplateTableView_RowDoubleClick"
ShowGroupPanel="False"
ShowGroupedColumns="false"
ShowTotalSummary="False" />
</dxg:GridControl.View>
</dxg:GridControl>
</Grid>

View File

@@ -1,4 +1,6 @@
using System;
using System.Collections.Generic;
using System.Linq;
using BS.Shared.DataContracts;
namespace BeWo.ViewModel
@@ -111,5 +113,37 @@ namespace BeWo.ViewModel
return pDataContract;
}
public string ToSingleLine()
{
var parts = new List<string>
{
AddressLine1,
AddressLine2,
Street,
PostalCode,
Town,
State,
Country
};
return string.Join(", ", parts.Where(p => !string.IsNullOrWhiteSpace(p)));
}
internal override void UpdateByDataContract(AddressDC pDataContract)
{
AddressLine1 = pDataContract.AddressLine1;
AddressLine2 = pDataContract.AddressLine2;
Country = pDataContract.Country;
L_Version = pDataContract.L_Version;
Latitude = pDataContract.Latitude;
Longitude = pDataContract.Longitude;
PostalCode = pDataContract.PostalCode;
State = pDataContract.State;
Street = pDataContract.Street;
Town = pDataContract.Town;
FirePropertyChangedItself();
}
}
}

View File

@@ -11,6 +11,7 @@ using BeWo.ViewModel.ListViewModel;
using BS.Shared;
using BS.Shared.Core;
using BS.Shared.DataContracts;
using BS.Shared.DataContracts.GkvAbrechnung;
namespace BeWo.ViewModel
{
@@ -856,7 +857,7 @@ namespace BeWo.ViewModel
get => _HausanschriftDatenannahmestelle;
set
{
_GroßkundenanschriftDatenannahmestelle = value;
_HausanschriftDatenannahmestelle = value;
FirePropertyChanged(nameof(HausanschriftDatenannahmestelle));
}
}
@@ -865,11 +866,10 @@ namespace BeWo.ViewModel
get => _PostfachanschriftDatenannahmestelle;
set
{
PostfachanschriftDatenannahmestelle = value;
_PostfachanschriftDatenannahmestelle = value;
FirePropertyChanged(nameof(PostfachanschriftDatenannahmestelle));
}
}
public AddressVM GroßkundenanschriftDatenannahmestelle
{
get => _GroßkundenanschriftDatenannahmestelle;
@@ -1101,14 +1101,37 @@ namespace BeWo.ViewModel
if (HausanschriftDatenannahmestelle is object && HausanschriftDatenannahmestelle.IsDirty)
pDataContract.HausanschriftDatenannahmestelle = HausanschriftDatenannahmestelle.CommitToDataContract();
else
pDataContract.HausanschriftDatenannahmestelle = null;
if (PostfachanschriftDatenannahmestelle is object && PostfachanschriftDatenannahmestelle.IsDirty)
pDataContract.PostfachanschriftDatenannahmestelle = PostfachanschriftDatenannahmestelle.CommitToDataContract();
else
pDataContract.PostfachanschriftDatenannahmestelle = null;
if (GroßkundenanschriftDatenannahmestelle is object && GroßkundenanschriftDatenannahmestelle.IsDirty)
pDataContract.GroßkundenanschriftDatenannahmestelle = GroßkundenanschriftDatenannahmestelle.CommitToDataContract();
else
pDataContract.GroßkundenanschriftDatenannahmestelle = null;
return pDataContract;
}
internal override void UpdateByDataContract(OrganisationDC pDataContract)
{
base.UpdateByDataContract(pDataContract);
}
public void UpdateByGetIKResponse(GkvAbrechnungGetIKResponseDC response)
{
BezDatenannahmestelle = response.BezDatenannahmestelle;
IKKostentrager = response.IKKostentrager;
IKDatenannahmestelle = response.IKDatenannahmestelle;
HausanschriftDatenannahmestelle.UpdateByDataContract(response.Hausanschrift);
FirePropertyChanged(nameof(HausanschriftDatenannahmestelle));
PostfachanschriftDatenannahmestelle.UpdateByDataContract(response.Postfachanschrift);
GroßkundenanschriftDatenannahmestelle.UpdateByDataContract(response.Großkundenanschrift);
}
}
}

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;
}
}
}

View File

@@ -193,10 +193,13 @@ namespace Host
if (response.Gefunden)
{
response.IKDatenannahmestelle = resolved.Item1;
response.IKKostentrager = resolved.Item2;
response.IKKrankenkasse = resolved.Item3;
response.BezDatenannahmestelle = resolved.Item4;
response.IKDatenannahmestelle = resolved.IKDatenannahmestelle;
response.IKKostentrager = resolved.IKKostentrager;
response.IKKrankenkasse = resolved.IKKrankenkasse;
response.BezDatenannahmestelle = resolved.BezDatenannahmestelle;
response.Hausanschrift = resolved.Hausanschrift;
response.Postfachanschrift = resolved.Postfachanschrift;
response.Großkundenanschrift = response.Großkundenanschrift;
}
SendResponse(response);

View File

@@ -238,9 +238,9 @@ namespace BeWo.Service.DCEntityMapper
MapperFactory.ArbeitszeitDC_Arbeitszeit.MergeWithEntitys(pDataContract.Arbeitszeiten, pEntity.Arbeitszeiten);
MapperFactory.FeiertagDC_Feiertag.MergeWithEntitys(pDataContract.Feiertage, pEntity.Feiertage);
MapperFactory.Address.MergeOrCreateWithEntity(pDataContract.HausanschriftDatenannahmestelle, pEntity.HausanschriftDatenannahmestelle);
MapperFactory.Address.MergeOrCreateWithEntity(pDataContract.PostfachanschriftDatenannahmestelle, pEntity.PostfachanschriftDatenannahmestelle);
MapperFactory.Address.MergeOrCreateWithEntity(pDataContract.GroßkundenanschriftDatenannahmestelle, pEntity.GroßkundenanschriftDatenannahmestelle);
pEntity.HausanschriftDatenannahmestelle = MapperFactory.Address.MergeOrCreateWithEntity(pDataContract.HausanschriftDatenannahmestelle, pEntity.HausanschriftDatenannahmestelle);
pEntity.PostfachanschriftDatenannahmestelle = MapperFactory.Address.MergeOrCreateWithEntity(pDataContract.PostfachanschriftDatenannahmestelle, pEntity.PostfachanschriftDatenannahmestelle);
pEntity.GroßkundenanschriftDatenannahmestelle = MapperFactory.Address.MergeOrCreateWithEntity(pDataContract.GroßkundenanschriftDatenannahmestelle, pEntity.GroßkundenanschriftDatenannahmestelle);
return pEntity;
}

View File

@@ -9,6 +9,7 @@ using BeWo.Service.ServiceContracts;
using BS.Shared;
using BS.Shared.AppSender;
using BS.Shared.Core;
using BS.Shared.DataContracts;
using BS.Shared.DataContracts.Compact;
using BS.Shared.DataContracts.GkvAbrechnung;
using BS.Shared.DataContracts.Light;
@@ -314,7 +315,10 @@ namespace BeWo.Service.ServiceImplementations
IKKostentrager = app8res.IKKostentrager,
IKKrankenkasse = app8res.IKKrankenkasse,
Message = app8res.Message,
Success = app8res.Success
Success = app8res.Success,
Hausanschrift = app8res.Hausanschrift ?? new AddressDC(),
Postfachanschrift=app8res.Postfachanschrift ?? new AddressDC(),
Großkundenanschrift =app8res.Großkundenanschrift ?? new AddressDC()
};
// Schaue, ob IK Krankenkassen bereits bei einer anderen Organisation hinterlegt ist

View File

@@ -24,5 +24,8 @@ namespace BS.Shared.DataContracts.GkvAbrechnung
[DataMember] public string IKKostentrager { get; set; }
[DataMember] public string IKDatenannahmestelle { get; set; }
[DataMember] public string BezDatenannahmestelle { get; set; }
[DataMember] public AddressDC Hausanschrift { get; set; }
[DataMember] public AddressDC Postfachanschrift { get; set; }
[DataMember] public AddressDC Großkundenanschrift { get; set; }
}
}

View File

@@ -0,0 +1,19 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace BS.Shared.DataContracts.Invoicing.GkvAbrechnung
{
public class GkvKostentragerdateiSummary
{
public string IKDatenannahmestelle{ get; set; }
public string BezDatenannahmestelle { get; set; }
public string IKKostentrager { get; set; }
public string IKKrankenkasse { get; set; }
public AddressDC Hausanschrift { get; set; }
public AddressDC Postfachanschrift { get; set; }
public AddressDC Großkundenanschrift { get; set; }
}
}

View File

@@ -18,5 +18,8 @@ namespace BS.Shared.DataContracts.GkvAbrechnung
[DataMember] public string IKKostentrager { get; set; }
[DataMember] public string IKDatenannahmestelle { get; set; }
[DataMember] public string BezDatenannahmestelle { get; set; }
[DataMember] public AddressDC Hausanschrift { get; set; }
[DataMember] public AddressDC Postfachanschrift { get; set; }
[DataMember] public AddressDC Großkundenanschrift { get; set; }
}
}

View File

@@ -202,6 +202,7 @@
<Compile Include="DataContracts\AppResponseDC.cs" />
<Compile Include="DataContracts\Invoicing\GkvAbrechnung\GkvAbrechnungGetIKRequestDC.cs" />
<Compile Include="DataContracts\Invoicing\GkvAbrechnung\GkvAbrechnungGetIKResponseDC.cs" />
<Compile Include="DataContracts\Invoicing\GkvAbrechnung\GkvKostentragerdateiSummary.cs" />
<Compile Include="DataContracts\Invoicing\GkvAbrechnung\GkvServerGetStatusRequestDC.cs" />
<Compile Include="DataContracts\Invoicing\GkvAbrechnung\GkvServerGetStatusResponseDC.cs" />
<Compile Include="DataContracts\Invoicing\GkvAbrechnung\GkvClientResultRequestDC.cs" />