Merge branch 'feature_rene_13_dakota'

# Conflicts:
#	.gitignore
#	BeWo/ServiceProxy/Generated.cs
This commit is contained in:
2025-02-26 12:46:25 +01:00
98 changed files with 4927 additions and 1742 deletions

View File

@@ -0,0 +1,134 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{9BAB16DE-E284-4B57-BD09-763FC5CE521A}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>BeWo.Styles</RootNamespace>
<AssemblyName>BeWo.Styles</AssemblyName>
<TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<Deterministic>true</Deterministic>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="DevExpress.Xpf.Core.v23.2, Version=23.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a, processorArchitecture=MSIL" />
<Reference Include="DevExpress.Xpf.Core.v23.2.Extensions, Version=23.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a, processorArchitecture=MSIL" />
<Reference Include="PresentationCore" />
<Reference Include="PresentationFramework" />
<Reference Include="PresentationFramework.Aero" />
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Xml" />
<Reference Include="WindowsBase" />
</ItemGroup>
<ItemGroup>
<Compile Include="Converters\EnumTranslationConverter.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
<Page Include="Colors\Colors.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Page Include="ControlStyles\ButtonStyles.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Page Include="ControlStyles\CheckBoxStyles.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Page Include="ControlStyles\ComboBoxStyles.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Page Include="ControlStyles\CustomControlsStyles.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Page Include="ControlStyles\DateEditStyles.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Page Include="ControlStyles\GroupBoxStyles.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Page Include="ControlStyles\LabelStyles.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Page Include="ControlStyles\ListBoxStyles.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Page Include="ControlStyles\NullItemComboBoxStyles.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Page Include="ControlStyles\RadioButtonStyles.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Page Include="ControlStyles\TextBoxStyles.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Page Include="ControlStyles\TextEditStyles.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Page Include="ControlStyles\ToggleButtonStyles.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Page Include="DataTemplates\ControlTemplates.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Page Include="DataTemplates\DataTemplates.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Page Include="ModernOrangeBlack.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Controls\Controls.csproj">
<Project>{d5e53b0f-bf5a-41e8-93e2-0f32845fc729}</Project>
<Name>Controls</Name>
</ProjectReference>
<ProjectReference Include="..\Shared\Shared.csproj">
<Project>{2f50b83d-a3f0-4ec4-979a-3f9b7e3d8ed4}</Project>
<Name>Shared</Name>
</ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>

View File

@@ -0,0 +1,16 @@
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<SolidColorBrush x:Key="TextBoxBorderBrush" Color="#FF86878F" />
<SolidColorBrush x:Key="ControlBackgroundBrush" Color="#FFFDC784" />
<SolidColorBrush x:Key="ControlSelectedBackgroundBrush" Color="#FFFFD86C" />
<SolidColorBrush x:Key="ControlMouseOverBackgroundBrush" Color="#FFDCA158" />
<SolidColorBrush x:Key="TabItemHotTextBrush" Color="#FFAB4A07" />
<LinearGradientBrush x:Key="ApplicationBackground" StartPoint="0.5,0" EndPoint="0.5,1">
<GradientStop Offset="0.38" Color="#FFDADADB" />
<GradientStop Offset="0.725" Color="#FFA9B8C2" />
<GradientStop Offset="0.91" Color="#FF4E565A" />
</LinearGradientBrush>
</ResourceDictionary>

View File

@@ -0,0 +1,153 @@
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<!-- Base -->
<Style x:Key="BaseButton" TargetType="{x:Type Button}">
<Setter Property="Margin" Value="3" />
<Setter Property="Height" Value="25" />
<Setter Property="HorizontalAlignment" Value="Center" />
<Setter Property="VerticalContentAlignment" Value="Center" />
<Setter Property="SnapsToDevicePixels" Value="True" />
<Setter Property="Foreground" Value="#FFFFFFFF" />
<Setter Property="FontFamily" Value="Microsoft Sans Serif" />
<Setter Property="FontSize" Value="12" />
</Style>
<Style
x:Key="PrimaryButton"
BasedOn="{StaticResource BaseButton}"
TargetType="{x:Type Button}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<ControlTemplate.Resources>
<Storyboard x:Key="Timeline1">
<DoubleAnimationUsingKeyFrames
BeginTime="00:00:00"
Storyboard.TargetName="glow"
Storyboard.TargetProperty="(UIElement.Opacity)">
<SplineDoubleKeyFrame KeyTime="00:00:00.3000000" Value="1" />
</DoubleAnimationUsingKeyFrames>
</Storyboard>
<Storyboard x:Key="Timeline2">
<DoubleAnimationUsingKeyFrames
BeginTime="00:00:00"
Storyboard.TargetName="glow"
Storyboard.TargetProperty="(UIElement.Opacity)">
<SplineDoubleKeyFrame KeyTime="00:00:00.3000000" Value="0" />
</DoubleAnimationUsingKeyFrames>
</Storyboard>
</ControlTemplate.Resources>
<Border
x:Name="border"
Padding="0,0,0,0"
BorderBrush="#FF000000"
BorderThickness="1,1,1,1"
CornerRadius="4,4,4,4">
<Border.Background>
<LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1">
<GradientStop Offset="0" Color="#FF000000" />
<GradientStop Offset="1" Color="#FF262626" />
</LinearGradientBrush>
</Border.Background>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="0.5*" />
<RowDefinition Height="0.5*" />
</Grid.RowDefinitions>
<Border
x:Name="glow"
Grid.RowSpan="2"
Width="Auto"
HorizontalAlignment="Stretch"
CornerRadius="4,4,4,4"
Opacity="0">
<Border.Background>
<RadialGradientBrush>
<RadialGradientBrush.RelativeTransform>
<TransformGroup>
<ScaleTransform ScaleX="1.702" ScaleY="2.243" />
<SkewTransform AngleX="0" AngleY="0" />
<RotateTransform Angle="0" />
<TranslateTransform X="-0.368" Y="-0.152" />
</TransformGroup>
</RadialGradientBrush.RelativeTransform>
<GradientStop Offset="0" Color="#B28DBDFF" />
<GradientStop Offset="1" Color="#008DBDFF" />
</RadialGradientBrush>
</Border.Background>
</Border>
<Border
x:Name="shine"
Grid.Row="0"
Width="Auto"
Margin="0,0,0,0"
HorizontalAlignment="Stretch"
CornerRadius="4,4,0,0">
<Border.Background>
<LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1">
<GradientStop Offset="0" Color="#99FFFFFF" />
<GradientStop Offset="1" Color="#33FFFFFF" />
</LinearGradientBrush>
</Border.Background>
</Border>
<Border
Grid.Row="0"
Grid.RowSpan="2"
Margin="0,0,0,0">
<ContentPresenter
Width="Auto"
Margin="3,0,3,0"
HorizontalAlignment="Center"
VerticalAlignment="Center" />
</Border>
</Grid>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsPressed" Value="True">
<Setter TargetName="shine" Property="Opacity" Value="0.4" />
<Setter TargetName="border" Property="Background" Value="#998DBDFF" />
<Setter TargetName="glow" Property="Visibility" Value="Hidden" />
<Setter TargetName="border" Property="BorderBrush" Value="#FF0C0C0C" />
</Trigger>
<Trigger Property="IsMouseOver" Value="True">
<Trigger.EnterActions>
<BeginStoryboard Storyboard="{StaticResource Timeline1}" />
</Trigger.EnterActions>
<Trigger.ExitActions>
<BeginStoryboard x:Name="Timeline2_BeginStoryboard" Storyboard="{StaticResource Timeline2}" />
</Trigger.ExitActions>
</Trigger>
<Trigger Property="IsEnabled" Value="False">
<Setter TargetName="border" Property="Background" Value="#FF808080" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style
x:Key="HideDisabledButton"
BasedOn="{StaticResource PrimaryButton}"
TargetType="{x:Type Button}">
<Style.Triggers>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsEnabled}" Value="False">
<Setter Property="Visibility" Value="Collapsed" />
</DataTrigger>
</Style.Triggers>
</Style>
<Style
x:Key="HideDisabledButtonSmall"
BasedOn="{StaticResource HideDisabledButton}"
TargetType="{x:Type Button}">
<Setter Property="Height" Value="21" />
</Style>
<Style
x:Key="PrimaryButtonSmall"
BasedOn="{StaticResource PrimaryButton}"
TargetType="{x:Type Button}">
<Setter Property="Height" Value="21" />
</Style>
</ResourceDictionary>

View File

@@ -0,0 +1,7 @@
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Style x:Key="CheckBoxBase" TargetType="{x:Type CheckBox}">
<Setter Property="Margin" Value="5" />
<Setter Property="Padding" Value="0" />
<Setter Property="VerticalAlignment" Value="Center" />
</Style>
</ResourceDictionary>

View File

@@ -0,0 +1,161 @@
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:Microsoft_Windows_Themes="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero"
xmlns:conv="clr-namespace:BeWo.Styles.Converters">
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="..\DataTemplates\ControlTemplates.xaml" />
<ResourceDictionary Source="..\ControlStyles\ToggleButtonStyles.xaml" />
</ResourceDictionary.MergedDictionaries>
<!-- ComboBox -->
<Style x:Key="BaseComboBox" TargetType="ComboBox">
<Setter Property="Margin" Value="3" />
<Setter Property="Height" Value="23" />
<Setter Property="FocusVisualStyle" Value="{DynamicResource ComboBoxFocusVisual}" />
<Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.WindowTextBrushKey}}" />
<Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.WindowBrushKey}}" />
<Setter Property="BorderBrush" Value="{DynamicResource TextBoxBorderBrush}" />
<Setter Property="BorderThickness" Value="1" />
<Setter Property="Padding" Value="1" />
<Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Auto" />
<Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto" />
<Setter Property="ScrollViewer.CanContentScroll" Value="True" />
<Setter Property="VerticalContentAlignment" Value="Center" />
</Style>
<Style
x:Key="PrimaryComboBox"
BasedOn="{StaticResource BaseComboBox}"
TargetType="ComboBox">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ComboBox}">
<Grid SnapsToDevicePixels="true">
<Border
x:Name="Bd"
MaxWidth="{TemplateBinding MaxWidth}"
Padding="1"
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}">
<Grid Grid.IsSharedSizeScope="true">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="1" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" SharedSizeGroup="ComboBoxButton" />
</Grid.ColumnDefinitions>
<Border
x:Name="SelectedItemBorder"
Grid.ColumnSpan="2"
Margin="2,1,20,1">
<ContentPresenter
Margin="3,0"
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
Content="{TemplateBinding SelectionBoxItem}"
ContentTemplate="{TemplateBinding SelectionBoxItemTemplate}"
ContentTemplateSelector="{TemplateBinding ItemTemplateSelector}"
SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
</Border>
<ToggleButton
Grid.ColumnSpan="3"
IsChecked="{Binding Path=IsDropDownOpen, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}"
Style="{StaticResource ComboBoxTransparentButtonStyle}" />
</Grid>
</Border>
<Popup
x:Name="PART_Popup"
AllowsTransparency="true"
Focusable="false"
IsOpen="{Binding Path=IsDropDownOpen, RelativeSource={RelativeSource TemplatedParent}}"
Placement="Bottom"
PopupAnimation="{DynamicResource {x:Static SystemParameters.ComboBoxPopupAnimationKey}}">
<Microsoft_Windows_Themes:SystemDropShadowChrome
x:Name="Shdw"
MinWidth="{TemplateBinding ActualWidth}"
MaxHeight="{TemplateBinding MaxDropDownHeight}"
Color="Transparent">
<Border
x:Name="DropDownBorder"
Background="{DynamicResource {x:Static SystemColors.WindowBrushKey}}"
BorderBrush="{DynamicResource {x:Static SystemColors.WindowFrameBrushKey}}"
BorderThickness="1">
<ScrollViewer>
<ItemsPresenter KeyboardNavigation.DirectionalNavigation="Contained" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
</ScrollViewer>
</Border>
</Microsoft_Windows_Themes:SystemDropShadowChrome>
</Popup>
</Grid>
<ControlTemplate.Triggers>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsSelectionBoxHighlighted" Value="true" />
<Condition Property="IsDropDownOpen" Value="false" />
</MultiTrigger.Conditions>
<Setter Property="Foreground" Value="#FF000000" />
</MultiTrigger>
<Trigger Property="IsSelectionBoxHighlighted" Value="true">
<Setter TargetName="SelectedItemBorder" Property="Background" Value="{DynamicResource ControlSelectedBackgroundBrush}" />
</Trigger>
<Trigger SourceName="PART_Popup" Property="HasDropShadow" Value="true">
<Setter TargetName="Shdw" Property="Margin" Value="0,0,5,5" />
<Setter TargetName="Shdw" Property="Color" Value="#71000000" />
</Trigger>
<Trigger Property="HasItems" Value="false">
<Setter TargetName="DropDownBorder" Property="MinHeight" Value="95" />
</Trigger>
<Trigger Property="IsEnabled" Value="false">
<Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}" />
<Setter TargetName="Bd" Property="Background" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}" />
</Trigger>
<Trigger Property="IsGrouping" Value="true">
<Setter Property="ScrollViewer.CanContentScroll" Value="false" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="IsEditable" Value="true">
<Setter Property="IsTabStop" Value="false" />
<Setter Property="Padding" Value="0,1" />
<Setter Property="Template" Value="{StaticResource ComboBoxEditableTemplate}" />
</Trigger>
</Style.Triggers>
</Style>
<Style
x:Key="NoWrapComboBox"
BasedOn="{StaticResource PrimaryComboBox}"
TargetType="ComboBox">
<Setter Property="ItemTemplate">
<Setter.Value>
<DataTemplate>
<TextBlock Text="{Binding Path=.}" TextWrapping="NoWrap" />
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
<conv:EnumTranslationConverter x:Key="EnumTranslationConverter" />
<DataTemplate x:Key="ListItemView">
<TextBlock
x:Name="textblock"
MaxWidth="362"
ScrollViewer.HorizontalScrollBarVisibility="Disabled"
Text="{Binding Path=., Converter={StaticResource EnumTranslationConverter}}"
TextTrimming="CharacterEllipsis"
TextWrapping="NoWrap"
ToolTip="{Binding Path=Text, RelativeSource={RelativeSource Self}}" />
</DataTemplate>
<Style
x:Key="EnumTranslationComboBox"
BasedOn="{StaticResource PrimaryComboBox}"
TargetType="ComboBox">
<Setter Property="ItemTemplate" Value="{StaticResource ListItemView}" />
<Setter Property="HorizontalAlignment" Value="Stretch" />
<Setter Property="MaxWidth" Value="400" />
</Style>
</ResourceDictionary>

View File

@@ -0,0 +1 @@
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" />

View File

@@ -0,0 +1,74 @@
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:dx="http://schemas.devexpress.com/winfx/2008/xaml/core"
xmlns:dxe="http://schemas.devexpress.com/winfx/2008/xaml/editors"
xmlns:dxei="http://schemas.devexpress.com/winfx/2008/xaml/editors/internal"
xmlns:dxet="http://schemas.devexpress.com/winfx/2008/xaml/editors/themekeys">
<Style
x:Key="BaseDateEdit"
BasedOn="{StaticResource {x:Type dxe:DateEdit}}"
TargetType="{x:Type dxe:DateEdit}">
<Setter Property="Margin" Value="3" />
<Setter Property="Padding" Value="1" />
<Setter Property="Height" Value="23" />
<Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.WindowBrushKey}}" />
<Setter Property="BorderBrush" Value="{StaticResource TextBoxBorderBrush}" />
<Setter Property="BorderThickness" Value="1" />
</Style>
<Style
x:Key="PrimaryDateEdit"
BasedOn="{StaticResource BaseDateEdit}"
TargetType="{x:Type dxe:DateEdit}">
<Style.Resources>
<DataTemplate x:Key="{dxet:ButtonsThemeKey ResourceKey=ToggleButtonInfoTemplate, IsThemeIndependent=True}">
<dx:ToggleStateButton
x:Name="PART_Item"
Margin="2"
dxei:SetIsCheckedToButtonInfoBehavior.IsEnabled="True"
IsChecked="{Binding Path=IsChecked, Mode=TwoWay}"
Style="{StaticResource ComboBoxTransparentButtonStyle}" />
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding Path=IsDefaultButton}" Value="True">
<Setter TargetName="PART_Item" Property="IsChecked" Value="{Binding Path=(dxe:BaseEdit.OwnerEdit).IsPopupOpen, RelativeSource={RelativeSource Self}, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
</DataTrigger>
<DataTrigger Binding="{Binding Path=IsDefaultButton}" Value="False">
<Setter TargetName="PART_Item" Property="HandleToggle" Value="False" />
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</Style.Resources>
</Style>
<Style
x:Key="DateEditDateOnly"
BasedOn="{StaticResource PrimaryDateEdit}"
TargetType="{x:Type dxe:DateEdit}">
<Setter Property="MaskType" Value="DateOnlyAdvancingCaret" />
<Setter Property="MaskUseAsDisplayFormat" Value="true" />
</Style>
<Style
x:Key="DateEditDateOnlyShort"
BasedOn="{StaticResource DateEditDateOnly}"
TargetType="{x:Type dxe:DateEdit}">
<Setter Property="Mask" Value="d" />
</Style>
<Style
x:Key="DateEditDateOnlyLong"
BasedOn="{StaticResource DateEditDateOnly}"
TargetType="{x:Type dxe:DateEdit}">
<Setter Property="Mask" Value="D" />
</Style>
<Style
x:Key="DateEditDateTime"
BasedOn="{StaticResource PrimaryDateEdit}"
TargetType="{x:Type dxe:DateEdit}">
<Setter Property="MaskType" Value="DateTimeAdvancingCaret" />
<Setter Property="MaskUseAsDisplayFormat" Value="true" />
</Style>
<Style
x:Key="DateEditDateTimeShort"
BasedOn="{StaticResource DateEditDateTime}"
TargetType="{x:Type dxe:DateEdit}">
<Setter Property="Mask" Value="F" />
</Style>
</ResourceDictionary>

View File

@@ -0,0 +1,52 @@
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Style x:Key="BaseGroupBox" TargetType="{x:Type GroupBox}">
<Setter Property="BorderThickness" Value="1" />
<Setter Property="Padding" Value="3" />
</Style>
<Style
x:Key="ObjectEditGroupBox"
BasedOn="{StaticResource BaseGroupBox}"
TargetType="{x:Type GroupBox}">
<!-- <Setter Property="BorderBrush" Value="#D5DFE5" />-->
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type GroupBox}">
<Grid SnapsToDevicePixels="true">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Border
x:Name="Header"
Grid.Row="0"
Grid.Column="0"
MinHeight="20"
Padding="3,0,3,0"
TextElement.FontFamily="Microsoft Sans Serif"
TextElement.FontSize="16"
TextElement.Foreground="{StaticResource TabItemHotTextBrush}">
<ContentPresenter
ContentSource="Header"
RecognizesAccessKey="True"
SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
</Border>
<Border
Grid.Row="1"
BorderBrush="#FF86878F"
BorderThickness="0,0,0,1" />
<ContentPresenter
Grid.Row="2"
Grid.Column="0"
Margin="{TemplateBinding Padding}"
SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>

View File

@@ -0,0 +1,19 @@
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Style x:Key="BaseLabel" TargetType="Label">
<Setter Property="IsEnabled" Value="True" />
<Setter Property="Margin" Value="3" />
<Setter Property="Padding" Value="3" />
<Setter Property="VerticalAlignment" Value="Top" />
<Setter Property="TextElement.Foreground" Value="#FF000000" />
</Style>
<Style x:Key="Header1" TargetType="Label">
<Setter Property="TextElement.FontSize" Value="16" />
<Setter Property="TextElement.Foreground" Value="{StaticResource TabItemHotTextBrush}" />
<Setter Property="TextElement.FontFamily" Value="Microsoft Sans Serif" />
<Setter Property="Padding" Value="3,0,3,0" />
<Setter Property="MinHeight" Value="20" />
<Setter Property="HorizontalAlignment" Value="Center" />
<Setter Property="Margin" Value="3,-6,3,6" />
</Style>
</ResourceDictionary>

View File

@@ -0,0 +1,27 @@
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<!-- ListBoxItems -->
<Style x:Key="PhotoListBoxItem" TargetType="ListBoxItem">
<Setter Property="HorizontalAlignment" Value="Stretch" />
<Style.Resources>
<SolidColorBrush
x:Key="{x:Static SystemColors.HighlightBrushKey}"
Opacity="0.4"
Color="AliceBlue" />
<SolidColorBrush
x:Key="{x:Static SystemColors.InactiveSelectionHighlightBrushKey}"
Opacity="0.4"
Color="AliceBlue" />
</Style.Resources>
</Style>
<!-- ListBox -->
<Style x:Key="PhotoListBox" TargetType="{x:Type ListBox}">
<Setter Property="Foreground" Value="Black" />
<Setter Property="Margin" Value="5" />
<Setter Property="MinHeight" Value="100" />
<Setter Property="MaxHeight" Value="800" />
<Setter Property="IsSynchronizedWithCurrentItem" Value="True" />
<Setter Property="SelectionMode" Value="Single" />
<Setter Property="ItemContainerStyle" Value="{StaticResource PhotoListBoxItem}" />
</Style>
</ResourceDictionary>

View File

@@ -0,0 +1,148 @@
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:Microsoft_Windows_Themes="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero"
xmlns:uc="clr-namespace:BeWo.Controls;assembly=BeWo.Controls">
<!-- NullItemComboBox -->
<Style x:Key="PrimaryNullItemComboBox" TargetType="uc:NullItemComboBox">
<Setter Property="Margin" Value="3" />
<Setter Property="Height" Value="23" />
<Setter Property="FocusVisualStyle" Value="{DynamicResource ComboBoxFocusVisual}" />
<Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.WindowTextBrushKey}}" />
<Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.WindowBrushKey}}" />
<Setter Property="BorderBrush" Value="{DynamicResource TextBoxBorderBrush}" />
<Setter Property="BorderThickness" Value="1" />
<Setter Property="Padding" Value="1" />
<Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Auto" />
<Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto" />
<Setter Property="ScrollViewer.CanContentScroll" Value="true" />
<Setter Property="VerticalContentAlignment" Value="Center" />
<Setter Property="ItemTemplate">
<Setter.Value>
<DataTemplate>
<TextBlock Text="{Binding Path=.}" TextWrapping="NoWrap" />
</DataTemplate>
</Setter.Value>
</Setter>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type uc:NullItemComboBox}">
<Grid SnapsToDevicePixels="true">
<Border
x:Name="Bd"
Padding="1"
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}">
<Grid Grid.IsSharedSizeScope="true">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="1" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" SharedSizeGroup="ComboBoxButton" />
</Grid.ColumnDefinitions>
<Border
x:Name="SelectedItemBorder"
Grid.ColumnSpan="2"
Margin="2,1,20,1">
<ContentPresenter
Margin="3,0"
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
Content="{TemplateBinding SelectionBoxItem}"
ContentTemplate="{TemplateBinding SelectionBoxItemTemplate}"
ContentTemplateSelector="{TemplateBinding ItemTemplateSelector}"
SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
</Border>
<ToggleButton
Grid.Column="0"
Grid.ColumnSpan="3"
IsChecked="{Binding Path=IsDropDownOpen, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}"
Style="{DynamicResource ComboBoxTransparentButtonStyle}" />
<Label
x:Name="label_nullText"
Grid.Column="0"
Grid.ColumnSpan="2"
Margin="5,3,20,3"
Padding="0"
HorizontalAlignment="Left"
VerticalAlignment="Center"
Content="{TemplateBinding NullText}"
IsHitTestVisible="False"
Visibility="Hidden" />
</Grid>
</Border>
<Popup
x:Name="PART_Popup"
AllowsTransparency="true"
Focusable="false"
IsOpen="{Binding Path=IsDropDownOpen, RelativeSource={RelativeSource TemplatedParent}}"
Placement="Bottom"
PopupAnimation="{DynamicResource {x:Static SystemParameters.ComboBoxPopupAnimationKey}}">
<Microsoft_Windows_Themes:SystemDropShadowChrome
x:Name="Shdw"
MinWidth="{TemplateBinding ActualWidth}"
MaxHeight="{TemplateBinding MaxDropDownHeight}"
Color="Transparent">
<Border
x:Name="DropDownBorder"
Background="{DynamicResource {x:Static SystemColors.WindowBrushKey}}"
BorderBrush="{DynamicResource {x:Static SystemColors.WindowFrameBrushKey}}"
BorderThickness="1">
<ScrollViewer>
<ItemsPresenter KeyboardNavigation.DirectionalNavigation="Contained" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
</ScrollViewer>
</Border>
</Microsoft_Windows_Themes:SystemDropShadowChrome>
</Popup>
</Grid>
<ControlTemplate.Triggers>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsSelectionBoxHighlighted" Value="true" />
<Condition Property="IsDropDownOpen" Value="false" />
</MultiTrigger.Conditions>
<Setter Property="Foreground" Value="#FF000000" />
</MultiTrigger>
<Trigger Property="IsSelectionBoxHighlighted" Value="true">
<Setter TargetName="SelectedItemBorder" Property="Background" Value="{DynamicResource ControlSelectedBackgroundBrush}" />
</Trigger>
<Trigger SourceName="PART_Popup" Property="HasDropShadow" Value="true">
<Setter TargetName="Shdw" Property="Margin" Value="0,0,5,5" />
<Setter TargetName="Shdw" Property="Color" Value="#71000000" />
</Trigger>
<Trigger Property="HasItems" Value="false">
<Setter TargetName="DropDownBorder" Property="MinHeight" Value="95" />
</Trigger>
<Trigger Property="IsEnabled" Value="false">
<Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}" />
<Setter TargetName="Bd" Property="Background" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}" />
</Trigger>
<Trigger Property="IsGrouping" Value="true">
<Setter Property="ScrollViewer.CanContentScroll" Value="false" />
</Trigger>
<Trigger Property="SelectedItem" Value="{x:Null}">
<Setter TargetName="label_nullText" Property="Visibility" Value="Visible" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="IsEditable" Value="true">
<Setter Property="IsTabStop" Value="false" />
<Setter Property="Padding" Value="0,1" />
<Setter Property="Template" Value="{DynamicResource ComboBoxEditableTemplate}" />
</Trigger>
</Style.Triggers>
</Style>
<Style
x:Key="EnumTranslationNullItemComboBox"
BasedOn="{StaticResource PrimaryNullItemComboBox}"
TargetType="{x:Type uc:NullItemComboBox}">
<Setter Property="ItemTemplate" Value="{DynamicResource ListItemView}" />
<Setter Property="HorizontalAlignment" Value="Stretch" />
<Setter Property="MaxWidth" Value="400" />
</Style>
</ResourceDictionary>

View File

@@ -0,0 +1,7 @@
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<!-- Base -->
<Style x:Key="BaseRadioButton" TargetType="RadioButton">
<Setter Property="Margin" Value="3" />
<Setter Property="VerticalAlignment" Value="Top" />
</Style>
</ResourceDictionary>

View File

@@ -0,0 +1,71 @@
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Style x:Key="TextBoxBase" TargetType="{x:Type TextBox}">
<Setter Property="Margin" Value="3" />
<Setter Property="Padding" Value="3" />
<Setter Property="Height" Value="23" />
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="HorizontalAlignment" Value="Stretch" />
</Style>
<Style
x:Key="TextBoxNoticeBase"
BasedOn="{StaticResource TextBoxBase}"
TargetType="{x:Type TextBox}">
<Setter Property="MinHeight" Value="23" />
<Setter Property="VerticalContentAlignment" Value="Stretch" />
<Setter Property="VerticalAlignment" Value="Stretch" />
<Setter Property="AcceptsReturn" Value="True" />
<Setter Property="VerticalScrollBarVisibility" Value="Auto" />
</Style>
<Style
x:Key="TextBoxNotice"
BasedOn="{StaticResource TextBoxNoticeBase}"
TargetType="{x:Type TextBox}">
<Setter Property="MaxHeight" Value="150" />
<Setter Property="Height" Value="auto" />
</Style>
<Style
x:Key="TextBoxNoticeLarge"
BasedOn="{StaticResource TextBoxNoticeBase}"
TargetType="{x:Type TextBox}">
<Setter Property="MinHeight" Value="58" />
<Setter Property="Height" Value="auto" />
<Setter Property="MaxHeight" Value="300" />
</Style>
<Style
x:Key="TextBoxNoticeExtended"
BasedOn="{StaticResource TextBoxNoticeBase}"
TargetType="{x:Type TextBox}">
<Setter Property="MinHeight" Value="150" />
<Setter Property="Height" Value="150" />
<Setter Property="MaxHeight" Value="150" />
</Style>
<Style
x:Key="TextBoxNoticeSmallExtended"
BasedOn="{StaticResource TextBoxNoticeBase}"
TargetType="{x:Type TextBox}">
<Setter Property="MinHeight" Value="75" />
<Setter Property="MaxHeight" Value="75" />
</Style>
<Style x:Key="ComboBoxEditableTextBox" TargetType="{x:Type TextBox}">
<Setter Property="OverridesDefaultStyle" Value="true" />
<Setter Property="AllowDrop" Value="true" />
<Setter Property="MinWidth" Value="0" />
<Setter Property="MinHeight" Value="0" />
<Setter Property="FocusVisualStyle" Value="{x:Null}" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type TextBox}">
<ScrollViewer
x:Name="PART_ContentHost"
Background="Transparent"
Focusable="false"
HorizontalScrollBarVisibility="Hidden"
VerticalScrollBarVisibility="Hidden" />
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>

View File

@@ -0,0 +1,76 @@
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:dx="http://schemas.devexpress.com/winfx/2008/xaml/core"
xmlns:dxe="http://schemas.devexpress.com/winfx/2008/xaml/editors">
<!-- Base -->
<Style x:Key="BaseTextEdit" TargetType="{x:Type dxe:TextEdit}">
<Setter Property="Margin" Value="3" />
<Setter Property="Height" Value="23" />
</Style>
<Style
x:Key="BaseNumberMaskTextEdit"
BasedOn="{StaticResource BaseTextEdit}"
TargetType="{x:Type dxe:TextEdit}">
<Setter Property="MaskType" Value="Numeric" />
<Setter Property="MaskUseAsDisplayFormat" Value="True" />
</Style>
<!-- Special -->
<Style
x:Key="TextEditNumber"
BasedOn="{StaticResource BaseNumberMaskTextEdit}"
TargetType="{x:Type dxe:TextEdit}">
<Setter Property="Mask" Value="N0" />
</Style>
<Style
x:Key="TextEditYear"
BasedOn="{StaticResource BaseNumberMaskTextEdit}"
TargetType="{x:Type dxe:TextEdit}">
<Setter Property="Mask" Value="0000" />
</Style>
<Style
x:Key="TextEditQm"
BasedOn="{StaticResource BaseNumberMaskTextEdit}"
TargetType="{x:Type dxe:TextEdit}">
<Setter Property="Mask" Value="######0.00 qm" />
</Style>
<Style
x:Key="TextEditCurrency"
BasedOn="{StaticResource BaseNumberMaskTextEdit}"
TargetType="{x:Type dxe:TextEdit}">
<Setter Property="Mask" Value="######0.## $" />
<Setter Property="dxe:NumericMaskOptions.AlwaysShowDecimalSeparator" Value="False" />
</Style>
<Style
x:Key="TextEditHours"
BasedOn="{StaticResource BaseNumberMaskTextEdit}"
TargetType="{x:Type dxe:TextEdit}">
<Setter Property="Mask" Value="########0.## Std" />
<Setter Property="dxe:NumericMaskOptions.AlwaysShowDecimalSeparator" Value="False" />
</Style>
<Style
x:Key="TextEditDays"
BasedOn="{StaticResource BaseNumberMaskTextEdit}"
TargetType="{x:Type dxe:TextEdit}">
<Setter Property="Mask" Value="########0.## Tage" />
<Setter Property="dxe:NumericMaskOptions.AlwaysShowDecimalSeparator" Value="False" />
</Style>
<!-- Numbers -->
<Style
x:Key="TextEditNumberDecimal"
BasedOn="{StaticResource BaseNumberMaskTextEdit}"
TargetType="{x:Type dxe:TextEdit}">
<Setter Property="Mask" Value="########0.##" />
<Setter Property="dxe:NumericMaskOptions.AlwaysShowDecimalSeparator" Value="False" />
</Style>
<Style
x:Key="TextEditNumberDecimalNullable"
BasedOn="{StaticResource BaseNumberMaskTextEdit}"
TargetType="{x:Type dxe:TextEdit}">
<Setter Property="Mask" Value="#########.##" />
<Setter Property="dxe:NumericMaskOptions.AlwaysShowDecimalSeparator" Value="False" />
</Style>
</ResourceDictionary>

View File

@@ -0,0 +1,149 @@
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Style x:Key="ComboBoxTransparentButtonStyle" TargetType="{x:Type ToggleButton}">
<Setter Property="MinWidth" Value="0" />
<Setter Property="MinHeight" Value="0" />
<Setter Property="Width" Value="Auto" />
<Setter Property="Height" Value="Auto" />
<Setter Property="Background" Value="Transparent" />
<Setter Property="Focusable" Value="false" />
<Setter Property="ClickMode" Value="Press" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ToggleButton}">
<ControlTemplate.Resources>
<Storyboard x:Key="Timeline1">
<DoubleAnimationUsingKeyFrames
BeginTime="00:00:00"
Storyboard.TargetName="glow"
Storyboard.TargetProperty="(UIElement.Opacity)">
<SplineDoubleKeyFrame KeyTime="00:00:00.3000000" Value="1" />
</DoubleAnimationUsingKeyFrames>
<DoubleAnimation
Storyboard.TargetName="border"
Storyboard.TargetProperty="(UIElement.RenderTransform).(ScaleTransform.ScaleX)"
To="1.3"
Duration="0:0:0.2" />
<DoubleAnimation
Storyboard.TargetName="border"
Storyboard.TargetProperty="(UIElement.RenderTransform).(ScaleTransform.ScaleY)"
To="1.3"
Duration="0:0:0.2" />
</Storyboard>
<Storyboard x:Key="Timeline2">
<DoubleAnimationUsingKeyFrames
BeginTime="00:00:00"
Storyboard.TargetName="glow"
Storyboard.TargetProperty="(UIElement.Opacity)">
<SplineDoubleKeyFrame KeyTime="00:00:00.3000000" Value="0" />
</DoubleAnimationUsingKeyFrames>
<DoubleAnimation
Storyboard.TargetName="border"
Storyboard.TargetProperty="(UIElement.RenderTransform).(ScaleTransform.ScaleX)"
Duration="0:0:0.2" />
<DoubleAnimation
Storyboard.TargetName="border"
Storyboard.TargetProperty="(UIElement.RenderTransform).(ScaleTransform.ScaleY)"
Duration="0:0:0.2" />
</Storyboard>
</ControlTemplate.Resources>
<Grid SnapsToDevicePixels="true">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Border
x:Name="border"
Grid.Column="1"
Width="{DynamicResource {x:Static SystemParameters.ScrollWidthKey}}"
Margin="0,0,0,0"
Padding="0,0,0,0"
BorderBrush="#FF000000"
BorderThickness="1,1,1,1"
CornerRadius="4,4,4,4">
<Border.Background>
<LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1">
<GradientStop Offset="0" Color="#FF000000" />
<GradientStop Offset="1" Color="#FF262626" />
</LinearGradientBrush>
</Border.Background>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="0.5*" />
<RowDefinition Height="0.5*" />
</Grid.RowDefinitions>
<Border
x:Name="glow"
Grid.RowSpan="2"
Width="Auto"
HorizontalAlignment="Stretch"
CornerRadius="3,3,3,3"
Opacity="0">
<Border.Background>
<RadialGradientBrush>
<RadialGradientBrush.RelativeTransform>
<TransformGroup>
<ScaleTransform ScaleX="1.702" ScaleY="2.243" />
<SkewTransform AngleX="0" AngleY="0" />
<RotateTransform Angle="0" />
<TranslateTransform X="-0.368" Y="-0.152" />
</TransformGroup>
</RadialGradientBrush.RelativeTransform>
<GradientStop Offset="0" Color="#B28DBDFF" />
<GradientStop Offset="1" Color="#008DBDFF" />
</RadialGradientBrush>
</Border.Background>
</Border>
<Border
x:Name="shine"
Grid.Row="0"
Width="Auto"
Margin="0,0,0,0"
HorizontalAlignment="Stretch"
CornerRadius="3,3,0,0">
<Border.Background>
<LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1">
<GradientStop Offset="0" Color="#99FFFFFF" />
<GradientStop Offset="1" Color="#33FFFFFF" />
</LinearGradientBrush>
</Border.Background>
</Border>
<TextBlock
Grid.Row="0"
Grid.RowSpan="2"
HorizontalAlignment="Center"
VerticalAlignment="Center"
FontFamily="Webdings"
FontSize="9"
Text="6"
TextWrapping="Wrap">
<TextBlock.Foreground>
<SolidColorBrush Color="{DynamicResource {x:Static SystemColors.ControlColorKey}}" />
</TextBlock.Foreground>
</TextBlock>
</Grid>
</Border>
<!-- <ToggleButton x:Name="Chrome" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" Style="{StaticResource ComboBoxReadonlyToggleButton}" Grid.ColumnSpan="2" IsChecked="{Binding Path=IsDropDownOpen, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}"/>-->
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsChecked" Value="True">
<Setter TargetName="shine" Property="Opacity" Value="0.4" />
<Setter TargetName="border" Property="Background" Value="#99FFA500" />
<Setter TargetName="glow" Property="Visibility" Value="Hidden" />
<Setter TargetName="border" Property="BorderBrush" Value="#FF0C0C0C" />
</Trigger>
<Trigger Property="IsMouseOver" Value="True">
<Trigger.EnterActions>
<BeginStoryboard Storyboard="{StaticResource Timeline1}" />
</Trigger.EnterActions>
<Trigger.ExitActions>
<BeginStoryboard x:Name="Timeline2_BeginStoryboard" Storyboard="{StaticResource Timeline2}" />
</Trigger.ExitActions>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>

View File

@@ -0,0 +1,37 @@
using BS.Shared.Core;
using System;
using System.Globalization;
using System.Windows.Data;
namespace BeWo.Styles.Converters
{
public class EnumTranslationConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is Enum e)
{
if (EnumTranslations.Wohnhilfe2Translation.TryGetValue(e, out string v))
{
return v;
}
// RE:
// EnumTranslationConverter, aber betrachtet nicht alle?
// Brauche hier eig nur EnumTranslations.Gkv2Translation
if (EnumTranslations.AllTranslations.TryGetValue(e, out string vv))
{
return vv;
}
return e;
}
return null;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
}

View File

@@ -0,0 +1,92 @@
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:Microsoft_Windows_Themes="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero">
<Style x:Key="ComboBoxFocusVisual">
<Setter Property="Control.Template">
<Setter.Value>
<ControlTemplate>
<Rectangle
Margin="4,4,21,4"
SnapsToDevicePixels="true"
Stroke="Black"
StrokeDashArray="1 2"
StrokeThickness="1" />
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<!-- Control Templates -->
<ControlTemplate x:Key="ComboBoxEditableTemplate" TargetType="{x:Type ComboBox}">
<Grid SnapsToDevicePixels="true">
<Border
x:Name="Bd"
Padding="1"
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}">
<Grid Grid.IsSharedSizeScope="true">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="1" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" SharedSizeGroup="ComboBoxButton" />
</Grid.ColumnDefinitions>
<TextBox
x:Name="PART_EditableTextBox"
Grid.Column="1"
Margin="{TemplateBinding Padding}"
HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}"
VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}"
IsReadOnly="{Binding Path=IsReadOnly, RelativeSource={RelativeSource TemplatedParent}}"
Style="{DynamicResource ComboBoxEditableTextBox}" />
<ToggleButton
Grid.Column="0"
Grid.ColumnSpan="3"
Background="{x:Null}"
IsChecked="{Binding Path=IsDropDownOpen, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}"
Style="{DynamicResource ComboBoxTransparentButtonStyle}" />
</Grid>
</Border>
<Popup
x:Name="PART_Popup"
AllowsTransparency="true"
Focusable="false"
IsOpen="{Binding Path=IsDropDownOpen, RelativeSource={RelativeSource TemplatedParent}}"
Placement="Bottom"
PopupAnimation="{DynamicResource {x:Static SystemParameters.ComboBoxPopupAnimationKey}}">
<Microsoft_Windows_Themes:SystemDropShadowChrome
x:Name="Shdw"
MinWidth="{TemplateBinding ActualWidth}"
MaxHeight="{TemplateBinding MaxDropDownHeight}"
Color="Transparent">
<Border
x:Name="DropDownBorder"
Background="{DynamicResource {x:Static SystemColors.WindowBrushKey}}"
BorderBrush="{DynamicResource {x:Static SystemColors.WindowFrameBrushKey}}"
BorderThickness="1">
<ScrollViewer>
<ItemsPresenter KeyboardNavigation.DirectionalNavigation="Contained" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
</ScrollViewer>
</Border>
</Microsoft_Windows_Themes:SystemDropShadowChrome>
</Popup>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="HasItems" Value="false">
<Setter TargetName="DropDownBorder" Property="MinHeight" Value="95" />
</Trigger>
<Trigger Property="IsEnabled" Value="false">
<Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}" />
<Setter TargetName="Bd" Property="Background" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}" />
</Trigger>
<Trigger Property="IsGrouping" Value="true">
<Setter Property="ScrollViewer.CanContentScroll" Value="false" />
</Trigger>
<Trigger SourceName="PART_Popup" Property="HasDropShadow" Value="true">
<Setter TargetName="Shdw" Property="Margin" Value="0,0,5,5" />
<Setter TargetName="Shdw" Property="Color" Value="#71000000" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</ResourceDictionary>

View File

@@ -0,0 +1,4 @@
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:conv="clr-namespace:BeWo.Styles.Converters" />

View File

@@ -0,0 +1,41 @@
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:controls="clr-namespace:BeWo.Controls;assembly=BeWo.Controls"
xmlns:dxe="http://schemas.devexpress.com/winfx/2008/xaml/editors">
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Colors\Colors.xaml" />
<ResourceDictionary Source="DataTemplates\ControlTemplates.xaml" />
<ResourceDictionary Source="DataTemplates\DataTemplates.xaml" />
<ResourceDictionary Source="ControlStyles\ButtonStyles.xaml" />
<ResourceDictionary Source="ControlStyles\CheckBoxStyles.xaml" />
<ResourceDictionary Source="ControlStyles\ComboBoxStyles.xaml" />
<ResourceDictionary Source="ControlStyles\CustomControlsStyles.xaml" />
<ResourceDictionary Source="ControlStyles\DateEditStyles.xaml" />
<ResourceDictionary Source="ControlStyles\GroupBoxStyles.xaml" />
<ResourceDictionary Source="ControlStyles\LabelStyles.xaml" />
<ResourceDictionary Source="ControlStyles\ListBoxStyles.xaml" />
<ResourceDictionary Source="ControlStyles\RadioButtonStyles.xaml" />
<ResourceDictionary Source="ControlStyles\TextBoxStyles.xaml" />
<ResourceDictionary Source="ControlStyles\TextEditStyles.xaml" />
<ResourceDictionary Source="ControlStyles\ToggleButtonStyles.xaml" />
<!-- Benötigt TextBoxStyles + ToggleButtonStyles -->
<ResourceDictionary Source="ControlStyles\NullItemComboBoxStyles.xaml" />
</ResourceDictionary.MergedDictionaries>
<!-- Default Styles -->
<Style BasedOn="{StaticResource HideDisabledButton}" TargetType="Button" />
<Style BasedOn="{StaticResource CheckBoxBase}" TargetType="CheckBox" />
<Style BasedOn="{StaticResource NoWrapComboBox}" TargetType="ComboBox" />
<Style BasedOn="{StaticResource PrimaryDateEdit}" TargetType="dxe:DateEdit" />
<Style BasedOn="{StaticResource BaseLabel}" TargetType="Label" />
<Style BasedOn="{StaticResource PrimaryNullItemComboBox}" TargetType="controls:NullItemComboBox" />
<Style BasedOn="{StaticResource BaseRadioButton}" TargetType="RadioButton" />
<Style BasedOn="{StaticResource TextBoxBase}" TargetType="TextBox" />
<Style BasedOn="{StaticResource BaseTextEdit}" TargetType="dxe:TextEdit" />
</ResourceDictionary>

View File

@@ -0,0 +1,36 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// Allgemeine Informationen über eine Assembly werden über die folgenden
// Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern,
// die einer Assembly zugeordnet sind.
[assembly: AssemblyTitle("BeWo.Styles")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("BeWo.Styles")]
[assembly: AssemblyCopyright("Copyright © 2025")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Durch Festlegen von ComVisible auf FALSE werden die Typen in dieser Assembly
// für COM-Komponenten unsichtbar. Wenn Sie auf einen Typ in dieser Assembly von
// COM aus zugreifen müssen, sollten Sie das ComVisible-Attribut für diesen Typ auf "True" festlegen.
[assembly: ComVisible(false)]
// Die folgende GUID bestimmt die ID der Typbibliothek, wenn dieses Projekt für COM verfügbar gemacht wird
[assembly: Guid("9bab16de-e284-4b57-bd09-763fc5ce521a")]
// Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten:
//
// Hauptversion
// Nebenversion
// Buildnummer
// Revision
//
// Sie können alle Werte angeben oder Standardwerte für die Build- und Revisionsnummern verwenden,
// indem Sie "*" wie unten gezeigt eingeben:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

View File

@@ -1,92 +1,133 @@
<UserControl xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" x:Class="BeWo.BSLogoControl" x:Name="UserControl" Foreground="AliceBlue" Width="800" Height="800">
<UserControl.Resources>
<SolidColorBrush x:Key="FillBrush" Color="#FFF18A00" />
<UserControl
x:Class="BeWo.BSLogoControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
x:Name="UserControl"
Width="800"
Height="800"
Foreground="AliceBlue">
<UserControl.Resources>
<SolidColorBrush x:Key="FillBrush" Color="#FFF18A00" />
<Style TargetType="{x:Type Ellipse}">
<Setter Property="Fill" Value="{Binding Path=Foreground, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type UserControl}}}" />
<Setter Property="Width" Value="20" />
<Setter Property="Height" Value="20" />
</Style>
</UserControl.Resources>
<Style TargetType="{x:Type Ellipse}">
<Setter Property="Fill" Value="{Binding Path=Foreground, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type UserControl}}}" />
<Setter Property="Width" Value="20" />
<Setter Property="Height" Value="20" />
</Style>
</UserControl.Resources>
<Grid>
<Viewbox StretchDirection="Both" Stretch="Fill" MaxWidth="{Binding Path=Width, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type UserControl}}}" MaxHeight="{Binding Path=Height, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type UserControl}}}">
<Canvas Width="800" Height="800">
<Canvas Width="100" Height="100" Canvas.Left="350" Canvas.Top="350">
<Ellipse Canvas.Left="40" Canvas.Top="6" />
<Ellipse Canvas.Left="10" Canvas.Top="56" />
<Ellipse Canvas.Left="70" Canvas.Top="56" />
</Canvas>
<Canvas Width="100" Height="100" Canvas.Left="350" Canvas.Top="350" RenderTransformOrigin="0.5,0.5">
<Canvas.RenderTransform>
<TransformGroup>
<ScaleTransform ScaleX="1.6" ScaleY="1.6" />
<SkewTransform AngleX="0" AngleY="0" />
<RotateTransform Angle="-20" />
<TranslateTransform X="0" Y="0" />
</TransformGroup>
</Canvas.RenderTransform>
<Ellipse Canvas.Left="40" Canvas.Top="6" />
<Ellipse Canvas.Left="10" Canvas.Top="56" />
<Ellipse Canvas.Left="70" Canvas.Top="56" />
</Canvas>
<Canvas Width="100" Height="100" Canvas.Left="350" Canvas.Top="350" RenderTransformOrigin="0.5,0.5">
<Canvas.RenderTransform>
<TransformGroup>
<ScaleTransform ScaleX="2.5" ScaleY="2.5" />
<SkewTransform AngleX="0" AngleY="0" />
<RotateTransform Angle="-42" />
<TranslateTransform X="0" Y="0" />
</TransformGroup>
</Canvas.RenderTransform>
<Ellipse Canvas.Left="40" Canvas.Top="6" />
<Ellipse Canvas.Left="10" Canvas.Top="56" />
<Ellipse Canvas.Left="70" Canvas.Top="56" />
</Canvas>
<Canvas Width="100" Height="100" Canvas.Left="350" Canvas.Top="350" RenderTransformOrigin="0.5,0.5">
<Canvas.RenderTransform>
<TransformGroup>
<ScaleTransform ScaleX="3.8" ScaleY="3.8" />
<SkewTransform AngleX="0" AngleY="0" />
<RotateTransform Angle="-65" />
<TranslateTransform X="0" Y="0" />
</TransformGroup>
</Canvas.RenderTransform>
<Ellipse Canvas.Left="40" Canvas.Top="6" />
<Ellipse Canvas.Left="10" Canvas.Top="56" />
<Ellipse Canvas.Left="70" Canvas.Top="56" />
</Canvas>
<Grid>
<Viewbox
MaxWidth="{Binding Path=Width, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type UserControl}}}"
MaxHeight="{Binding Path=Height, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type UserControl}}}"
Stretch="Fill"
StretchDirection="Both">
<Canvas Width="800" Height="800">
<Canvas
Canvas.Left="350"
Canvas.Top="350"
Width="100"
Height="100">
<Ellipse Canvas.Left="40" Canvas.Top="6" />
<Ellipse Canvas.Left="10" Canvas.Top="56" />
<Ellipse Canvas.Left="70" Canvas.Top="56" />
</Canvas>
<Canvas
Canvas.Left="350"
Canvas.Top="350"
Width="100"
Height="100"
RenderTransformOrigin="0.5,0.5">
<Canvas.RenderTransform>
<TransformGroup>
<ScaleTransform ScaleX="1.6" ScaleY="1.6" />
<SkewTransform AngleX="0" AngleY="0" />
<RotateTransform Angle="-20" />
<TranslateTransform X="0" Y="0" />
</TransformGroup>
</Canvas.RenderTransform>
<Ellipse Canvas.Left="40" Canvas.Top="6" />
<Ellipse Canvas.Left="10" Canvas.Top="56" />
<Ellipse Canvas.Left="70" Canvas.Top="56" />
</Canvas>
<Canvas
Canvas.Left="350"
Canvas.Top="350"
Width="100"
Height="100"
RenderTransformOrigin="0.5,0.5">
<Canvas.RenderTransform>
<TransformGroup>
<ScaleTransform ScaleX="2.5" ScaleY="2.5" />
<SkewTransform AngleX="0" AngleY="0" />
<RotateTransform Angle="-42" />
<TranslateTransform X="0" Y="0" />
</TransformGroup>
</Canvas.RenderTransform>
<Ellipse Canvas.Left="40" Canvas.Top="6" />
<Ellipse Canvas.Left="10" Canvas.Top="56" />
<Ellipse Canvas.Left="70" Canvas.Top="56" />
</Canvas>
<Canvas
Canvas.Left="350"
Canvas.Top="350"
Width="100"
Height="100"
RenderTransformOrigin="0.5,0.5">
<Canvas.RenderTransform>
<TransformGroup>
<ScaleTransform ScaleX="3.8" ScaleY="3.8" />
<SkewTransform AngleX="0" AngleY="0" />
<RotateTransform Angle="-65" />
<TranslateTransform X="0" Y="0" />
</TransformGroup>
</Canvas.RenderTransform>
<Ellipse Canvas.Left="40" Canvas.Top="6" />
<Ellipse Canvas.Left="10" Canvas.Top="56" />
<Ellipse Canvas.Left="70" Canvas.Top="56" />
</Canvas>
<Canvas Width="100" Height="100" Canvas.Left="350" Canvas.Top="350" RenderTransformOrigin="0.5,0.5">
<Canvas.RenderTransform>
<TransformGroup>
<ScaleTransform ScaleX="5.8" ScaleY="5.8" />
<SkewTransform AngleX="0" AngleY="0" />
<RotateTransform Angle="-88" />
<TranslateTransform X="0" Y="0" />
</TransformGroup>
</Canvas.RenderTransform>
<Ellipse Canvas.Left="40" Canvas.Top="6" />
<Ellipse Canvas.Left="10" Canvas.Top="56" />
<Ellipse Canvas.Left="70" Canvas.Top="56" />
</Canvas>
<Canvas Width="100" Height="100" Canvas.Left="350" Canvas.Top="350" RenderTransformOrigin="0.5,0.5">
<Canvas.RenderTransform>
<TransformGroup>
<ScaleTransform ScaleX="9" ScaleY="9" />
<SkewTransform AngleX="0" AngleY="0" />
<RotateTransform Angle="-110" />
<TranslateTransform X="0" Y="0" />
</TransformGroup>
</Canvas.RenderTransform>
<Ellipse Canvas.Left="40" Canvas.Top="6" />
<Ellipse Canvas.Left="10" Canvas.Top="56" />
<Ellipse Canvas.Left="70" Canvas.Top="56" />
</Canvas>
<Canvas
Canvas.Left="350"
Canvas.Top="350"
Width="100"
Height="100"
RenderTransformOrigin="0.5,0.5">
<Canvas.RenderTransform>
<TransformGroup>
<ScaleTransform ScaleX="5.8" ScaleY="5.8" />
<SkewTransform AngleX="0" AngleY="0" />
<RotateTransform Angle="-88" />
<TranslateTransform X="0" Y="0" />
</TransformGroup>
</Canvas.RenderTransform>
<Ellipse Canvas.Left="40" Canvas.Top="6" />
<Ellipse Canvas.Left="10" Canvas.Top="56" />
<Ellipse Canvas.Left="70" Canvas.Top="56" />
</Canvas>
<Canvas
Canvas.Left="350"
Canvas.Top="350"
Width="100"
Height="100"
RenderTransformOrigin="0.5,0.5">
<Canvas.RenderTransform>
<TransformGroup>
<ScaleTransform ScaleX="9" ScaleY="9" />
<SkewTransform AngleX="0" AngleY="0" />
<RotateTransform Angle="-110" />
<TranslateTransform X="0" Y="0" />
</TransformGroup>
</Canvas.RenderTransform>
<Ellipse Canvas.Left="40" Canvas.Top="6" />
<Ellipse Canvas.Left="10" Canvas.Top="56" />
<Ellipse Canvas.Left="70" Canvas.Top="56" />
</Canvas>
</Canvas>
</Viewbox>
</Grid>
</Canvas>
</Viewbox>
</Grid>
</UserControl>

View File

@@ -2101,9 +2101,9 @@ namespace BeWo.ServiceProxy
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.DataContracts.ServiceInvoicePeriodDC))]
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.DataContracts.InvoiceNumberDC))]
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(System.Collections.Generic.List<BS.Shared.DataContracts.InvoiceNumberDC>))]
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.DataContracts.AppResponseDC))]
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.InvoiceType))]
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.GkvTransferResultType))]
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.GkvRawDataType))]
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.DataContracts.GkvAbrechnung.GkvAbrechnungDC))]
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(System.Collections.Generic.List<BS.Shared.DataContracts.GkvAbrechnung.GkvTransferProtokollDC>))]
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.DataContracts.GkvAbrechnung.GkvTransferProtokollDC))]
@@ -2116,6 +2116,7 @@ namespace BeWo.ServiceProxy
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.DataContracts.GkvAbrechnung.GkvAbrechnungSendResponseDC))]
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.DataContracts.GkvAbrechnung.GkvAbrechnungGetIKRequestDC))]
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.DataContracts.GkvAbrechnung.GkvAbrechnungGetIKResponseDC))]
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.DataContracts.AppResponseDC))]
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(System.IO.MemoryStream))]
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(System.IO.Stream))]
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(System.Collections.Generic.List<System.DateTime>))]
@@ -5991,9 +5992,9 @@ namespace BeWo.ServiceProxy
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.DataContracts.ServiceInvoicePeriodDC))]
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.DataContracts.InvoiceNumberDC))]
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(System.Collections.Generic.List<BS.Shared.DataContracts.InvoiceNumberDC>))]
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.DataContracts.AppResponseDC))]
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.InvoiceType))]
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.GkvTransferResultType))]
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.GkvRawDataType))]
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.DataContracts.GkvAbrechnung.GkvAbrechnungDC))]
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(System.Collections.Generic.List<BS.Shared.DataContracts.GkvAbrechnung.GkvTransferProtokollDC>))]
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.DataContracts.GkvAbrechnung.GkvTransferProtokollDC))]
@@ -6006,6 +6007,7 @@ namespace BeWo.ServiceProxy
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.DataContracts.GkvAbrechnung.GkvAbrechnungSendResponseDC))]
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.DataContracts.GkvAbrechnung.GkvAbrechnungGetIKRequestDC))]
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.DataContracts.GkvAbrechnung.GkvAbrechnungGetIKResponseDC))]
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(BS.Shared.DataContracts.AppResponseDC))]
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(System.IO.MemoryStream))]
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(System.IO.Stream))]
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(System.Collections.Generic.List<System.DateTime>))]
@@ -9762,38 +9764,6 @@ namespace BeWo.ServiceProxy
[System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IAccountingService/StorniereInvoiceBases", ReplyAction="http://tempuri.org/IAccountingService/StorniereInvoiceBasesResponse")]
[System.ServiceModel.FaultContractAttribute(typeof(BeWo.ServiceProxy.BeWoFault), Action="http://tempuri.org/IAccountingService/StorniereInvoiceBasesBeWoFaultFault", Name="BeWoFault", Namespace="http://schemas.datacontract.org/2004/07/BeWo.Service.ServiceContracts")]
void StorniereInvoiceBases(System.Collections.Generic.List<BS.Shared.DataContracts.InvoiceBaseDC> invoices);
[System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IAccountingService/GetGkvAbrechnung", ReplyAction="http://tempuri.org/IAccountingService/GetGkvAbrechnungResponse")]
[System.ServiceModel.FaultContractAttribute(typeof(BeWo.ServiceProxy.BeWoFault), Action="http://tempuri.org/IAccountingService/GetGkvAbrechnungBeWoFaultFault", Name="BeWoFault", Namespace="http://schemas.datacontract.org/2004/07/BeWo.Service.ServiceContracts")]
BS.Shared.DataContracts.GkvAbrechnung.GkvAbrechnungDC GetGkvAbrechnung(long oid);
[System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IAccountingService/GetAllGkvAbrechnungen", ReplyAction="http://tempuri.org/IAccountingService/GetAllGkvAbrechnungenResponse")]
[System.ServiceModel.FaultContractAttribute(typeof(BeWo.ServiceProxy.BeWoFault), Action="http://tempuri.org/IAccountingService/GetAllGkvAbrechnungenBeWoFaultFault", Name="BeWoFault", Namespace="http://schemas.datacontract.org/2004/07/BeWo.Service.ServiceContracts")]
System.Collections.Generic.List<BS.Shared.DataContracts.GkvAbrechnung.GkvAbrechnungDC> GetAllGkvAbrechnungen();
[System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IAccountingService/GetFilteredGkvAbrechnungen", ReplyAction="http://tempuri.org/IAccountingService/GetFilteredGkvAbrechnungenResponse")]
[System.ServiceModel.FaultContractAttribute(typeof(BeWo.ServiceProxy.BeWoFault), Action="http://tempuri.org/IAccountingService/GetFilteredGkvAbrechnungenBeWoFaultFault", Name="BeWoFault", Namespace="http://schemas.datacontract.org/2004/07/BeWo.Service.ServiceContracts")]
System.Collections.Generic.List<BS.Shared.DataContracts.GkvAbrechnung.GkvAbrechnungDC> GetFilteredGkvAbrechnungen(BS.Shared.DataContracts.GkvAbrechnung.GkvAbrechnungViewFilterDC gkvAbrechnungViewFilter);
[System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IAccountingService/CreateNewGkvAbrechnung", ReplyAction="http://tempuri.org/IAccountingService/CreateNewGkvAbrechnungResponse")]
[System.ServiceModel.FaultContractAttribute(typeof(BeWo.ServiceProxy.BeWoFault), Action="http://tempuri.org/IAccountingService/CreateNewGkvAbrechnungBeWoFaultFault", Name="BeWoFault", Namespace="http://schemas.datacontract.org/2004/07/BeWo.Service.ServiceContracts")]
BS.Shared.DataContracts.GkvAbrechnung.GkvAbrechnungCreateResponseDC CreateNewGkvAbrechnung(BS.Shared.DataContracts.GkvAbrechnung.GkvAbrechnungCreateRequestDC request);
[System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IAccountingService/UpdateGkvAbrechnung", ReplyAction="http://tempuri.org/IAccountingService/UpdateGkvAbrechnungResponse")]
[System.ServiceModel.FaultContractAttribute(typeof(BeWo.ServiceProxy.BeWoFault), Action="http://tempuri.org/IAccountingService/UpdateGkvAbrechnungBeWoFaultFault", Name="BeWoFault", Namespace="http://schemas.datacontract.org/2004/07/BeWo.Service.ServiceContracts")]
BS.Shared.DataContracts.GkvAbrechnung.GkvAbrechnungDC UpdateGkvAbrechnung(BS.Shared.DataContracts.GkvAbrechnung.GkvAbrechnungDC abrechnung);
[System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IAccountingService/DeleteGkvAbrechnung", ReplyAction="http://tempuri.org/IAccountingService/DeleteGkvAbrechnungResponse")]
[System.ServiceModel.FaultContractAttribute(typeof(BeWo.ServiceProxy.BeWoFault), Action="http://tempuri.org/IAccountingService/DeleteGkvAbrechnungBeWoFaultFault", Name="BeWoFault", Namespace="http://schemas.datacontract.org/2004/07/BeWo.Service.ServiceContracts")]
void DeleteGkvAbrechnung(BS.Shared.DataContracts.GkvAbrechnung.GkvAbrechnungDC abrechnung);
[System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IAccountingService/SendNewGkvAbrechnung", ReplyAction="http://tempuri.org/IAccountingService/SendNewGkvAbrechnungResponse")]
[System.ServiceModel.FaultContractAttribute(typeof(BeWo.ServiceProxy.BeWoFault), Action="http://tempuri.org/IAccountingService/SendNewGkvAbrechnungBeWoFaultFault", Name="BeWoFault", Namespace="http://schemas.datacontract.org/2004/07/BeWo.Service.ServiceContracts")]
BS.Shared.DataContracts.GkvAbrechnung.GkvAbrechnungSendResponseDC SendNewGkvAbrechnung(BS.Shared.DataContracts.GkvAbrechnung.GkvAbrechnungSendRequestDC req);
[System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IAccountingService/SendGetIKRequest", ReplyAction="http://tempuri.org/IAccountingService/SendGetIKRequestResponse")]
[System.ServiceModel.FaultContractAttribute(typeof(BeWo.ServiceProxy.BeWoFault), Action="http://tempuri.org/IAccountingService/SendGetIKRequestBeWoFaultFault", Name="BeWoFault", Namespace="http://schemas.datacontract.org/2004/07/BeWo.Service.ServiceContracts")]
BS.Shared.DataContracts.GkvAbrechnung.GkvAbrechnungGetIKResponseDC SendGetIKRequest(BS.Shared.DataContracts.GkvAbrechnung.GkvAbrechnungGetIKRequestDC req);
}
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
@@ -9989,6 +9959,84 @@ namespace BeWo.ServiceProxy
{
base.Channel.StorniereInvoiceBases(invoices);
}
}
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
[System.ServiceModel.ServiceContractAttribute(ConfigurationName="BeWo.ServiceProxy.IGkvAccountingService")]
public interface IGkvAccountingService
{
[System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IGkvAccountingService/GetGkvAbrechnung", ReplyAction="http://tempuri.org/IGkvAccountingService/GetGkvAbrechnungResponse")]
[System.ServiceModel.FaultContractAttribute(typeof(BeWo.ServiceProxy.BeWoFault), Action="http://tempuri.org/IGkvAccountingService/GetGkvAbrechnungBeWoFaultFault", Name="BeWoFault", Namespace="http://schemas.datacontract.org/2004/07/BeWo.Service.ServiceContracts")]
BS.Shared.DataContracts.GkvAbrechnung.GkvAbrechnungDC GetGkvAbrechnung(long oid);
[System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IGkvAccountingService/GetAllGkvAbrechnungen", ReplyAction="http://tempuri.org/IGkvAccountingService/GetAllGkvAbrechnungenResponse")]
[System.ServiceModel.FaultContractAttribute(typeof(BeWo.ServiceProxy.BeWoFault), Action="http://tempuri.org/IGkvAccountingService/GetAllGkvAbrechnungenBeWoFaultFault", Name="BeWoFault", Namespace="http://schemas.datacontract.org/2004/07/BeWo.Service.ServiceContracts")]
System.Collections.Generic.List<BS.Shared.DataContracts.GkvAbrechnung.GkvAbrechnungDC> GetAllGkvAbrechnungen();
[System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IGkvAccountingService/GetFilteredGkvAbrechnungen", ReplyAction="http://tempuri.org/IGkvAccountingService/GetFilteredGkvAbrechnungenResponse")]
[System.ServiceModel.FaultContractAttribute(typeof(BeWo.ServiceProxy.BeWoFault), Action="http://tempuri.org/IGkvAccountingService/GetFilteredGkvAbrechnungenBeWoFaultFault" +
"", Name="BeWoFault", Namespace="http://schemas.datacontract.org/2004/07/BeWo.Service.ServiceContracts")]
System.Collections.Generic.List<BS.Shared.DataContracts.GkvAbrechnung.GkvAbrechnungDC> GetFilteredGkvAbrechnungen(BS.Shared.DataContracts.GkvAbrechnung.GkvAbrechnungViewFilterDC gkvAbrechnungViewFilter);
[System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IGkvAccountingService/GetProtokollRawDataString", ReplyAction="http://tempuri.org/IGkvAccountingService/GetProtokollRawDataStringResponse")]
[System.ServiceModel.FaultContractAttribute(typeof(BeWo.ServiceProxy.BeWoFault), Action="http://tempuri.org/IGkvAccountingService/GetProtokollRawDataStringBeWoFaultFault", Name="BeWoFault", Namespace="http://schemas.datacontract.org/2004/07/BeWo.Service.ServiceContracts")]
string GetProtokollRawDataString(long oid, BS.Shared.GkvRawDataType gkvRawData);
[System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IGkvAccountingService/CreateNewGkvAbrechnung", ReplyAction="http://tempuri.org/IGkvAccountingService/CreateNewGkvAbrechnungResponse")]
[System.ServiceModel.FaultContractAttribute(typeof(BeWo.ServiceProxy.BeWoFault), Action="http://tempuri.org/IGkvAccountingService/CreateNewGkvAbrechnungBeWoFaultFault", Name="BeWoFault", Namespace="http://schemas.datacontract.org/2004/07/BeWo.Service.ServiceContracts")]
BS.Shared.DataContracts.GkvAbrechnung.GkvAbrechnungCreateResponseDC CreateNewGkvAbrechnung(BS.Shared.DataContracts.GkvAbrechnung.GkvAbrechnungCreateRequestDC request);
[System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IGkvAccountingService/UpdateGkvAbrechnung", ReplyAction="http://tempuri.org/IGkvAccountingService/UpdateGkvAbrechnungResponse")]
[System.ServiceModel.FaultContractAttribute(typeof(BeWo.ServiceProxy.BeWoFault), Action="http://tempuri.org/IGkvAccountingService/UpdateGkvAbrechnungBeWoFaultFault", Name="BeWoFault", Namespace="http://schemas.datacontract.org/2004/07/BeWo.Service.ServiceContracts")]
BS.Shared.DataContracts.GkvAbrechnung.GkvAbrechnungDC UpdateGkvAbrechnung(BS.Shared.DataContracts.GkvAbrechnung.GkvAbrechnungDC abrechnung);
[System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IGkvAccountingService/DeleteGkvAbrechnung", ReplyAction="http://tempuri.org/IGkvAccountingService/DeleteGkvAbrechnungResponse")]
[System.ServiceModel.FaultContractAttribute(typeof(BeWo.ServiceProxy.BeWoFault), Action="http://tempuri.org/IGkvAccountingService/DeleteGkvAbrechnungBeWoFaultFault", Name="BeWoFault", Namespace="http://schemas.datacontract.org/2004/07/BeWo.Service.ServiceContracts")]
void DeleteGkvAbrechnung(BS.Shared.DataContracts.GkvAbrechnung.GkvAbrechnungDC abrechnung);
[System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IGkvAccountingService/SendNewGkvAbrechnung", ReplyAction="http://tempuri.org/IGkvAccountingService/SendNewGkvAbrechnungResponse")]
[System.ServiceModel.FaultContractAttribute(typeof(BeWo.ServiceProxy.BeWoFault), Action="http://tempuri.org/IGkvAccountingService/SendNewGkvAbrechnungBeWoFaultFault", Name="BeWoFault", Namespace="http://schemas.datacontract.org/2004/07/BeWo.Service.ServiceContracts")]
BS.Shared.DataContracts.GkvAbrechnung.GkvAbrechnungSendResponseDC SendNewGkvAbrechnung(BS.Shared.DataContracts.GkvAbrechnung.GkvAbrechnungSendRequestDC req);
[System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IGkvAccountingService/SendGetIKRequest", ReplyAction="http://tempuri.org/IGkvAccountingService/SendGetIKRequestResponse")]
[System.ServiceModel.FaultContractAttribute(typeof(BeWo.ServiceProxy.BeWoFault), Action="http://tempuri.org/IGkvAccountingService/SendGetIKRequestBeWoFaultFault", Name="BeWoFault", Namespace="http://schemas.datacontract.org/2004/07/BeWo.Service.ServiceContracts")]
BS.Shared.DataContracts.GkvAbrechnung.GkvAbrechnungGetIKResponseDC SendGetIKRequest(BS.Shared.DataContracts.GkvAbrechnung.GkvAbrechnungGetIKRequestDC req);
}
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
public interface IGkvAccountingServiceChannel : BeWo.ServiceProxy.IGkvAccountingService, System.ServiceModel.IClientChannel
{
}
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
public partial class GkvAccountingServiceClient : System.ServiceModel.ClientBase<BeWo.ServiceProxy.IGkvAccountingService>, BeWo.ServiceProxy.IGkvAccountingService
{
public GkvAccountingServiceClient()
{
}
public GkvAccountingServiceClient(string endpointConfigurationName) :
base(endpointConfigurationName)
{
}
public GkvAccountingServiceClient(string endpointConfigurationName, string remoteAddress) :
base(endpointConfigurationName, remoteAddress)
{
}
public GkvAccountingServiceClient(string endpointConfigurationName, System.ServiceModel.EndpointAddress remoteAddress) :
base(endpointConfigurationName, remoteAddress)
{
}
public GkvAccountingServiceClient(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress) :
base(binding, remoteAddress)
{
}
public BS.Shared.DataContracts.GkvAbrechnung.GkvAbrechnungDC GetGkvAbrechnung(long oid)
{
@@ -10005,6 +10053,11 @@ namespace BeWo.ServiceProxy
return base.Channel.GetFilteredGkvAbrechnungen(gkvAbrechnungViewFilter);
}
public string GetProtokollRawDataString(long oid, BS.Shared.GkvRawDataType gkvRawData)
{
return base.Channel.GetProtokollRawDataString(oid, gkvRawData);
}
public BS.Shared.DataContracts.GkvAbrechnung.GkvAbrechnungCreateResponseDC CreateNewGkvAbrechnung(BS.Shared.DataContracts.GkvAbrechnung.GkvAbrechnungCreateRequestDC request)
{
return base.Channel.CreateNewGkvAbrechnung(request);

View File

@@ -6,13 +6,15 @@ using System.ServiceModel;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Threading;
using BeWo.Multitenancy;
using BeWo.Security;
using BS.Shared;
using BS.Shared.DataContracts;
using BS.Shared.DataContracts.Compact;
using DevExpress.CodeParser;
namespace BeWo.ServiceProxy
{
@@ -59,6 +61,7 @@ namespace BeWo.ServiceProxy
{ typeof(IAnalysisService), new EndpointAddress(_ServerName + "AnalysisService.svc") },
{ typeof(IMailService), new EndpointAddress(_ServerName + "MailService.svc") },
{ typeof(IAccountingService), new EndpointAddress(_ServerName + "AccountingService.svc") },
{ typeof(IGkvAccountingService), new EndpointAddress(_ServerName + "GkvAccountingService.svc") },
{ typeof(IReportService), new EndpointAddress(_ServerName + "ReportService.svc") }
};
@@ -232,21 +235,19 @@ namespace BeWo.ServiceProxy
return default(T);
}
public static void DoWohnheimServiceAsync<T>(Func<ICustomerService, T> pFunc, Action<T> pCallBack, bool showWaitDialog)
#region Wohnheim
public static void DoWohnheimServiceAsync<T>(Func<ICustomerService, T> pFunc, Action<T> pCallBack, bool showWaitDialog)
{
DoAsync<CustomerServiceClient, ICustomerService, T>(pFunc, pCallBack, showWaitDialog);
}
public static void DoWohnheimServiceAsync<T>(Func<ICustomerService, T> pFunc, Action<T> pCallBack)
{
DoAsync<CustomerServiceClient, ICustomerService, T>(pFunc, pCallBack, true);
}
public static void DoWohnheimServiceAsync(Action<ICustomerService> pAction)
{
DoAsync<CustomerServiceClient,ICustomerService>(pAction, true);
}
public static void DoWohnheimServiceSync(Action<ICustomerService> pAction)
{
try
@@ -258,12 +259,11 @@ namespace BeWo.ServiceProxy
ShowErrorMessage(e);
}
}
public static T DoWohnheimServiceSync<T>(Func<IOperationsService, T> pFunc)
public static T DoWohnheimServiceSync<T>(Func<ICustomerService, T> pFunc)
{
try
{
return pFunc.Invoke(GetInstance<OperationsServiceClient, IOperationsService>());
return pFunc.Invoke(GetInstance<CustomerServiceClient, ICustomerService>());
}
catch (Exception e)
{
@@ -272,8 +272,61 @@ namespace BeWo.ServiceProxy
return default(T);
}
#endregion
public static void DoMailServiceAsync<T>(Func<IMailService, T> pFunc, Action<T> pCallBack)
#region GkvAccounting
public static void DoGkvAccountingServiceAsync<T>(Func<IGkvAccountingService, T> pFunc, Action<T> pCallBack, bool showWaitDialog)
{
DoAsync<GkvAccountingServiceClient, IGkvAccountingService, T>(pFunc, pCallBack, showWaitDialog);
}
public static void DoGkvAccountingServiceAsync<T>(Func<IGkvAccountingService, T> pFunc, Action<T> pCallBack)
{
DoAsync<GkvAccountingServiceClient, IGkvAccountingService, T>(pFunc, pCallBack, true);
}
public static void DoGkvAccountingServiceAsyncGUI<T>(Func<IGkvAccountingService, T> pFunc, Action<T> pCallBack, Dispatcher dispatcher)
{
Action<T> action = (t) => dispatcher.BeginInvoke(
DispatcherPriority.Normal,
(Action)delegate
{
pCallBack(t);
});
DoAsync<GkvAccountingServiceClient, IGkvAccountingService, T>(pFunc, action, true);
}
public static void DoGkvAccountingServiceAsync(Action<IGkvAccountingService> pAction)
{
DoAsync<GkvAccountingServiceClient, IGkvAccountingService>(pAction, true);
}
public static void DoGkvAccountingServiceSync(Action<IGkvAccountingService> pAction)
{
try
{
pAction.Invoke(GetInstance<GkvAccountingServiceClient, IGkvAccountingService>());
}
catch (Exception e)
{
ShowErrorMessage(e);
}
}
public static T DoGkvAccountingServiceSync<T>(Func<IGkvAccountingService, T> pFunc)
{
try
{
return pFunc.Invoke(GetInstance<GkvAccountingServiceClient, IGkvAccountingService>());
}
catch (Exception e)
{
ShowErrorMessage(e);
}
return default(T);
}
#endregion
public static void DoMailServiceAsync<T>(Func<IMailService, T> pFunc, Action<T> pCallBack)
{
DoAsync<MailServiceClient, IMailService, T>(pFunc, pCallBack, true);
}

View File

@@ -1 +1 @@
svcutil.exe /noConfig /edb /n:*,BeWo.ServiceProxy /out:ServiceProxy\Generated.cs /ct:System.Collections.Generic.List`1 /r:..\Shared\bin\Debug\BS.Shared.dll http://localhost:3777/Host/EmployeeService.svc?wsdl http://localhost:3777/Host/CustomerService.svc?wsdl http://localhost:3777/Host/UserService.svc?wsdl http://localhost:3777/Host/StreamingService.svc?wsdl http://localhost:3777/Host/ValueListService.svc?wsdl http://localhost:3777/Host/DownloadService.svc?wsdl http://localhost:3777/Host/ResourceService.svc?wsdl http://localhost:3777/Host/OperationsService.svc?wsdl http://localhost:3777/Host/AnalysisService.svc?wsdl http://localhost:3777/Host/MailService.svc?wsdl http://localhost:3777/Host/AccountingService.svc?wsdl http://localhost:3777/Host/ReportService.svc?wsdl http://localhost:3777/Host/QueryService.svc?wsdl
svcutil.exe /noConfig /edb /n:*,BeWo.ServiceProxy /out:ServiceProxy\Generated.cs /ct:System.Collections.Generic.List`1 /r:..\Shared\bin\Debug\BS.Shared.dll http://localhost:3777/Host/EmployeeService.svc?wsdl http://localhost:3777/Host/CustomerService.svc?wsdl http://localhost:3777/Host/UserService.svc?wsdl http://localhost:3777/Host/StreamingService.svc?wsdl http://localhost:3777/Host/ValueListService.svc?wsdl http://localhost:3777/Host/DownloadService.svc?wsdl http://localhost:3777/Host/ResourceService.svc?wsdl http://localhost:3777/Host/OperationsService.svc?wsdl http://localhost:3777/Host/AnalysisService.svc?wsdl http://localhost:3777/Host/MailService.svc?wsdl http://localhost:3777/Host/AccountingService.svc?wsdl http://localhost:3777/Host/GkvAccountingService.svc?wsdl http://localhost:3777/Host/ReportService.svc?wsdl http://localhost:3777/Host/QueryService.svc?wsdl

View File

@@ -1,4 +1,5 @@
using BeWo.Core;
using BeWo.ServiceProxy;
using BeWo.ViewModel;
using BeWo.ViewModel.ListViewModel;
using BS.Shared.DataContracts.GkvAbrechnung;
@@ -21,86 +22,87 @@ using System.Windows.Shapes;
namespace BeWo.View.Controls
{
/// <summary>
/// Interaktionslogik für GkvAbrechnungDetailControl.xaml
/// </summary>
public partial class GkvAbrechnungDetailControl : UserControl
{
/// <summary>
/// Interaktionslogik für GkvAbrechnungDetailControl.xaml
/// </summary>
public partial class GkvAbrechnungDetailControl : UserControl
{
public GkvAbrechnungVM GkvAbrechnungVM { get; set; }
public Window Window { get; private set; }
public Window Window { get; private set; }
public GkvAbrechnungDetailControl(GkvAbrechnungVM vm, Window window)
{
InitializeComponent();
GkvAbrechnungVM = vm;
DataContext = vm;
Window = window;
}
private void Hyperlink_OnRequestNavigate(object sender, RequestNavigateEventArgs e)
{
BeWoUtils.NavigateToReportUri(((Hyperlink)sender).NavigateUri.ToString(), "Druckvorschau");
}
private void gridView_Loaded(object sender, RoutedEventArgs e)
{
var tableView = sender as TableView;
if (tableView != null)
{
foreach (var item in tableView.VisibleColumns)
{
tableView.BestFitColumn(item);
}
}
}
private void btn_auftragsdatei_Click(object sender, RoutedEventArgs e)
{
var vm = datagrid_transfer.GetCurrentValue<GkvTransferProtokollDC>();
var window = BeWoWindowBuilder.GetTextViewer("Auftragsdatei", vm.Auftragsdatei);
window.Owner = Window;
window.ShowDialog();
}
private void btn_nutzdatendatei_Click(object sender, RoutedEventArgs e)
{
var vm = datagrid_transfer.GetCurrentValue<GkvTransferProtokollDC>();
var window = BeWoWindowBuilder.GetTextViewer("Nutzdatendatei", vm.Nutzdatendatei);
window.Owner = Window;
window.ShowDialog();
}
private void button_checkAll_Click(object sender, RoutedEventArgs e)
public GkvAbrechnungDetailControl(GkvAbrechnungVM vm, Window window)
{
InitializeComponent();
GkvAbrechnungVM = vm;
DataContext = vm;
Window = window;
}
private void button_uncheckAll_Click(object sender, RoutedEventArgs e)
private void Hyperlink_OnRequestNavigate(object sender, RequestNavigateEventArgs e)
{
BeWoUtils.NavigateToReportUri(((Hyperlink)sender).NavigateUri.ToString(), "Druckvorschau");
}
private void gridView_CellValueChanging(object sender, CellValueChangedEventArgs e)
{
if (e.Column is null)
return;
private void gridView_Loaded(object sender, RoutedEventArgs e)
{
var tableView = sender as TableView;
if (tableView != null)
{
foreach (var item in tableView.VisibleColumns)
{
tableView.BestFitColumn(item);
}
}
}
if (e.Column.FieldName == nameof(InvoiceBaseVM.IsChecked))
{
if (e.Value is bool b && e.Row is InvoiceBaseVM vm)
{
vm.IsChecked = b;
}
}
}
}
private void btn_auftragsdatei_Click(object sender, RoutedEventArgs e)
{
var protokoll = datagrid_transfer.GetCurrentValue<GkvTransferProtokollDC>();
var oid = protokoll.GkvTransferProtokollOid.Value;
ServiceFacade.DoGkvAccountingServiceAsyncGUI(
service => service.GetProtokollRawDataString(oid, BS.Shared.GkvRawDataType.Auftragsdatei),
callback => ShowTextViewer("Auftragsdatei", callback),
Dispatcher);
}
private void btn_nutzdatendatei_Click(object sender, RoutedEventArgs e)
{
var protokoll = datagrid_transfer.GetCurrentValue<GkvTransferProtokollDC>();
var oid = protokoll.GkvTransferProtokollOid.Value;
ServiceFacade.DoGkvAccountingServiceAsyncGUI(
service => service.GetProtokollRawDataString(oid, BS.Shared.GkvRawDataType.Nutzdatendatei),
callback => ShowTextViewer("Nutzdatendatei", callback),
Dispatcher);
}
private void ShowTextViewer(string title, string text)
{
var window = BeWoWindowBuilder.GetTextViewer(title, text);
window.Owner = Window;
window.ShowDialog();
}
private void gridView_CellValueChanging(object sender, CellValueChangedEventArgs e)
{
if (e.Column is null)
return;
if (e.Column.FieldName == nameof(InvoiceBaseVM.IsChecked))
{
if (e.Value is bool b && e.Row is InvoiceBaseVM vm)
{
vm.IsChecked = b;
}
}
}
}
}

View File

@@ -17,6 +17,7 @@ using BeWo.ViewModel;
using BeWo.ViewModel.ListViewModel;
using BS.Shared;
using BS.Shared.AppSender;
using BS.Shared.Core;
using BS.Shared.DataContracts;
using BS.Shared.DataContracts.GkvAbrechnung;
@@ -72,7 +73,7 @@ namespace BeWo.View.Detail.Accounting
{
_IsRequesting = true;
ServiceFacade.DoAccountingServiceAsync(s => s.GetFilteredGkvAbrechnungen(null), UpdateGkvAbrechnungList);
ServiceFacade.DoGkvAccountingServiceAsync(s => s.GetFilteredGkvAbrechnungen(null), UpdateGkvAbrechnungList);
}
catch(Exception e)
{
@@ -184,7 +185,7 @@ namespace BeWo.View.Detail.Accounting
SelectedInvoiceBases = checked_invoice_bases.Select(x => x.DataContract.InvoiceBaseOid.Value).ToList()
};
ServiceFacade.DoAccountingServiceAsync(x => x.CreateNewGkvAbrechnung(gkv_filter),
ServiceFacade.DoGkvAccountingServiceAsync(x => x.CreateNewGkvAbrechnung(gkv_filter),
cb => Dispatcher.BeginInvoke(DispatcherPriority.Normal,
(Action)delegate
{
@@ -234,7 +235,7 @@ namespace BeWo.View.Detail.Accounting
{
var dc_in = vm.CommitToDataContract();
ServiceFacade.DoAccountingServiceAsync(x => x.UpdateGkvAbrechnung(dc_in), dc_out =>
ServiceFacade.DoGkvAccountingServiceAsync(x => x.UpdateGkvAbrechnung(dc_in), dc_out =>
{
Dispatcher.Invoke(() => {
vm.UpdateByDataContract(dc_out);
@@ -267,7 +268,7 @@ namespace BeWo.View.Detail.Accounting
{
_Viewmodel.VMList.Remove(vm);
ServiceFacade.DoAccountingServiceAsync(s => s.DeleteGkvAbrechnung(vm.CommitToDataContract()));
ServiceFacade.DoGkvAccountingServiceAsync(s => s.DeleteGkvAbrechnung(vm.CommitToDataContract()));
}
}
private void NewButton_OnClick(object sender, RoutedEventArgs e)
@@ -360,7 +361,7 @@ namespace BeWo.View.Detail.Accounting
dc_in.Bezahlt = b;
ServiceFacade.DoAccountingServiceAsync(x => x.UpdateGkvAbrechnung(dc_in), dc_out =>
ServiceFacade.DoGkvAccountingServiceAsync(x => x.UpdateGkvAbrechnung(dc_in), dc_out =>
{
Dispatcher.Invoke(() => {
vm.UpdateByDataContract(dc_out);
@@ -374,7 +375,7 @@ namespace BeWo.View.Detail.Accounting
dc_in.UrbelegeGesendet = b;
ServiceFacade.DoAccountingServiceAsync(x => x.UpdateGkvAbrechnung(dc_in), dc_out =>
ServiceFacade.DoGkvAccountingServiceAsync(x => x.UpdateGkvAbrechnung(dc_in), dc_out =>
{
Dispatcher.Invoke(() => {
vm.UpdateByDataContract(dc_out);
@@ -386,7 +387,7 @@ namespace BeWo.View.Detail.Accounting
{
var dc_in = vm.CommitToDataContract();
ServiceFacade.DoAccountingServiceAsync(x => x.UpdateGkvAbrechnung(dc_in), dc_out =>
ServiceFacade.DoGkvAccountingServiceAsync(x => x.UpdateGkvAbrechnung(dc_in), dc_out =>
{
Dispatcher.Invoke(() => {
vm.UpdateByDataContract(dc_out);

View File

@@ -449,8 +449,10 @@
Grid.Row="7"
Grid.ColumnSpan="2"
Margin="3,20,3,5"
Checked="EnableArbeitszeiterfassung_Checked"
Content="{markup:Translate Arbeitszeit mit BeWoPlaner erfassen}"
IsChecked="{Binding Path=EnableArbeitszeiterfassung}" Checked="EnableArbeitszeiterfassung_Checked" Unchecked="EnableArbeitszeiterfassung_Checked"/>
IsChecked="{Binding Path=EnableArbeitszeiterfassung}"
Unchecked="EnableArbeitszeiterfassung_Checked" />
<CheckBox
x:Name="EnableAutomaticPauses"
Grid.Row="8"

View File

@@ -325,7 +325,7 @@ namespace BeWo.View.Detail
req.IKKrankenkasse = ViewModel.IKKrankenkasse;
req.Leistungserbringergruppe = ViewModel.Leistungserbringergruppe;
ServiceFacade.DoAccountingServiceAsync(x => x.SendGetIKRequest(req), cb => Dispatcher.Invoke(() => IKRequestCallback(req, cb)));
ServiceFacade.DoGkvAccountingServiceAsync(x => x.SendGetIKRequest(req), cb => Dispatcher.Invoke(() => IKRequestCallback(req, cb)));
}
private void IKRequestCallback(GkvAbrechnungGetIKRequestDC req, GkvAbrechnungGetIKResponseDC response)

View File

@@ -452,7 +452,7 @@ namespace BeWo.ViewModel
req.GkvAbrechnungOid = GkvAbrechnungOid.Value;
ServiceFacade.DoAccountingServiceAsync(s => s.SendNewGkvAbrechnung(req),
ServiceFacade.DoGkvAccountingServiceAsync(s => s.SendNewGkvAbrechnung(req),
cb => Application.Current.Dispatch(() => UpdateBySendResponse(cb)), true);
}
public void UpdateBySendResponse(GkvAbrechnungSendResponseDC cb)

View File

@@ -43,6 +43,7 @@
<endpoint binding="basicHttpBinding" bindingConfiguration="BeWoBasicEndpoint" contract="BeWo.ServiceProxy.IResourceService" name="BeWoBasicEndpoint" />
<endpoint behaviorConfiguration="BeWoServiceBehavior" binding="basicHttpBinding" bindingConfiguration="BeWoBasicEndpoint" contract="BeWo.ServiceProxy.IOperationsService" name="OperationsServiceEndpoint" />
<endpoint behaviorConfiguration="BeWoServiceBehavior" binding="basicHttpBinding" bindingConfiguration="BeWoBasicEndpoint" contract="BeWo.ServiceProxy.IAccountingService" name="AccountingServiceEndpoint" />
<endpoint behaviorConfiguration="BeWoServiceBehavior" binding="basicHttpBinding" bindingConfiguration="BeWoBasicEndpoint" contract="BeWo.ServiceProxy.IGkvAccountingService" name="GkvAccountingServiceEndpoint" />
<endpoint behaviorConfiguration="BeWoServiceBehavior" binding="basicHttpBinding" bindingConfiguration="BeWoBasicEndpoint" contract="BeWo.ServiceProxy.IAnalysisService" name="AnalysisServiceEndpoint" />
<endpoint binding="basicHttpBinding" bindingConfiguration="BeWoBasicEndpoint" contract="BeWo.ServiceProxy.IMailService" name="MailServiceEndpoint" />
<endpoint binding="basicHttpBinding" bindingConfiguration="BeWoBasicEndpoint" contract="BeWo.ServiceProxy.IReportService" name="ReportServiceEndpoint" />

View File

@@ -41,6 +41,12 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DakotaUnitTest", "DakotaUni
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TranslationUnitTest", "TranslationUnitTest\TranslationUnitTest.csproj", "{83C43FEC-233D-49EF-BD23-BF842A3EBDF5}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tools", "Tools", "{BF0F7058-96E7-492B-8224-7976A32A751C}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BeWo.Styles", "BeWo.Styles\BeWo.Styles.csproj", "{9BAB16DE-E284-4B57-BD09-763FC5CE521A}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KTDReaderGUI", "Tools\KTDReaderGUI\KTDReaderGUI\KTDReaderGUI.csproj", "{F8EE2279-EDEA-4D4A-9D0F-89B7DA7E6AC2}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|.NET = Debug|.NET
@@ -199,6 +205,30 @@ Global
{83C43FEC-233D-49EF-BD23-BF842A3EBDF5}.Release|Any CPU.Build.0 = Release|Any CPU
{83C43FEC-233D-49EF-BD23-BF842A3EBDF5}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{83C43FEC-233D-49EF-BD23-BF842A3EBDF5}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{9BAB16DE-E284-4B57-BD09-763FC5CE521A}.Debug|.NET.ActiveCfg = Debug|Any CPU
{9BAB16DE-E284-4B57-BD09-763FC5CE521A}.Debug|.NET.Build.0 = Debug|Any CPU
{9BAB16DE-E284-4B57-BD09-763FC5CE521A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9BAB16DE-E284-4B57-BD09-763FC5CE521A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9BAB16DE-E284-4B57-BD09-763FC5CE521A}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{9BAB16DE-E284-4B57-BD09-763FC5CE521A}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{9BAB16DE-E284-4B57-BD09-763FC5CE521A}.Release|.NET.ActiveCfg = Release|Any CPU
{9BAB16DE-E284-4B57-BD09-763FC5CE521A}.Release|.NET.Build.0 = Release|Any CPU
{9BAB16DE-E284-4B57-BD09-763FC5CE521A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9BAB16DE-E284-4B57-BD09-763FC5CE521A}.Release|Any CPU.Build.0 = Release|Any CPU
{9BAB16DE-E284-4B57-BD09-763FC5CE521A}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{9BAB16DE-E284-4B57-BD09-763FC5CE521A}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{F8EE2279-EDEA-4D4A-9D0F-89B7DA7E6AC2}.Debug|.NET.ActiveCfg = Debug|Any CPU
{F8EE2279-EDEA-4D4A-9D0F-89B7DA7E6AC2}.Debug|.NET.Build.0 = Debug|Any CPU
{F8EE2279-EDEA-4D4A-9D0F-89B7DA7E6AC2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{F8EE2279-EDEA-4D4A-9D0F-89B7DA7E6AC2}.Debug|Any CPU.Build.0 = Debug|Any CPU
{F8EE2279-EDEA-4D4A-9D0F-89B7DA7E6AC2}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{F8EE2279-EDEA-4D4A-9D0F-89B7DA7E6AC2}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{F8EE2279-EDEA-4D4A-9D0F-89B7DA7E6AC2}.Release|.NET.ActiveCfg = Release|Any CPU
{F8EE2279-EDEA-4D4A-9D0F-89B7DA7E6AC2}.Release|.NET.Build.0 = Release|Any CPU
{F8EE2279-EDEA-4D4A-9D0F-89B7DA7E6AC2}.Release|Any CPU.ActiveCfg = Release|Any CPU
{F8EE2279-EDEA-4D4A-9D0F-89B7DA7E6AC2}.Release|Any CPU.Build.0 = Release|Any CPU
{F8EE2279-EDEA-4D4A-9D0F-89B7DA7E6AC2}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{F8EE2279-EDEA-4D4A-9D0F-89B7DA7E6AC2}.Release|Mixed Platforms.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -216,6 +246,8 @@ Global
{A959FE9A-1647-4C02-B2EE-6A95EBF6DC9A} = {FEB0336B-F053-40B6-92DD-7DE56AB9408A}
{B1FF561D-1677-4B06-9168-E7B024084B69} = {2AA59C1D-5537-4C49-9F9D-6E7CF827F687}
{83C43FEC-233D-49EF-BD23-BF842A3EBDF5} = {2AA59C1D-5537-4C49-9F9D-6E7CF827F687}
{9BAB16DE-E284-4B57-BD09-763FC5CE521A} = {E7543C39-A44C-40C9-82C9-E7FAA2D9A852}
{F8EE2279-EDEA-4D4A-9D0F-89B7DA7E6AC2} = {BF0F7058-96E7-492B-8224-7976A32A751C}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {5352BE53-F2FD-442F-85A8-4157599AA153}

View File

@@ -153,12 +153,24 @@
</ItemGroup>
<ItemGroup />
<ItemGroup>
<Content Include="KTDatei\AO05Q424.ke0.txt" />
<Content Include="KTDatei\BK05Q424.ke1.txt" />
<Content Include="KTDatei\BN05Q424.ke1.txt" />
<Content Include="KTDatei\EK05Q324.ke4.txt" />
<Content Include="KTDatei\IK05Q424.ke0.txt" />
<Content Include="KTDatei\LK05Q223.ke0.txt" />
<Content Include="KTDatei\AO05Q125.ke0.txt">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<Content Include="KTDatei\BK05Q125.ke3.txt">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<Content Include="KTDatei\BN05Q424.ke1.txt">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<Content Include="KTDatei\EK05Q125.ke0.txt">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<Content Include="KTDatei\IK05Q125.ke1.txt">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<Content Include="KTDatei\LK05Q223.ke0.txt">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>

View File

@@ -1,5 +1,5 @@
UNA:+,? '
UNB+UNOC:3+109910000+999999999+240910:1202+00388++AO05Q424ke0'
UNB+UNOC:3+109910000+999999999+241210:1038+00390++AO05Q125ke0'
UNH+00001+KOTR:02:001:KV'
IDK+100295017+99+gkv informatik'
VDT+19970403'
@@ -318,7 +318,7 @@ VKG+09+104212594+5++28++++63'
VKG+09+101519213+5++28++++65'
VKG+09+104212538+5++28++++66'
VKG+09+104212594+5++28++++67'
VKG+09+104212594+5++28++++40'
VKG+09+104212300+5++28++++40'
VKG+09+104212594+5++28++++69'
VKG+09+101519213+5++28++++99'
VKG+03+101519213+5++07++++00'
@@ -1109,7 +1109,7 @@ VKG+09+184212516+5++28++++30'
VKG+03+104212516+5++07++++00'
VKG+09+104212607+5++28++++18'
VKG+09+104212607+5++28++++19'
VKG+09+104212594+5++28++++40'
VKG+09+104212300+5++28++++40'
VKG+09+104212607+5++28++++11'
VKG+09+104212607+5++28++++15'
VKG+01+104212505+5++++++00'
@@ -1134,11 +1134,10 @@ UNH+00080+KOTR:02:001:KV'
IDK+104212538+99+AOK Rheinland/Hamburg'
VDT+19970403'
FKT+02'
NAM+01+AOK Rheinland/Hamburg+Fachbereich Rechnungsprüfung'
ANS+2+40004+Düsseldorf+101338'
NAM+01+AOK Rheinland/Hamburg+Rechnungsprüfung Heilmittel'
ANS+1+40468+Düsseldorf+Wanheimer Str. 72'
ASP+01+02118791/55743++Frau Jacobs-Lange+Heilmittel'
ASP+02+02118791/55716++Frau Krawzyk+Fahrtkosten'
UNT+000009+00080'
UNT+000008+00080'
UNH+00081+KOTR:02:001:KV'
IDK+104212594+99+AOK Rheinland/Hamburg'
VDT+20030915'
@@ -2522,4 +2521,12 @@ FKT+01'
NAM+01+CompetenzCenter Thüringen GmbH'
ANS+1+98528+Suhl+Fröhliche-Mann-Str. 3b'
UNT+000007+00205'
UNZ+000205+00388'
UNH+00206+KOTR:02:001:KV'
IDK+104212300+99+AOK Rheinland/Hamburg'
VDT+19970403'
FKT+02'
NAM+01+AOK Rheinland/Hamburg+Rechnungsprüfung Fahrkosten'
ANS+1+40468+Düsseldorf+Wanheimer Str. 72'
ASP+01+02118791/56515++Frau Kromat+Fahrkosten'
UNT+000008+00206'
UNZ+000206+00390'

View File

@@ -1,5 +1,5 @@
UNA:+,? '
UNB+UNOC:3+104027544+999999999+240909:0000+00235++BK05Q424ke1'
UNB+UNOC:3+104027544+999999999+250123:1530+00239++BK05Q125KE3'
UNH+00001+KOTR:02:001:KV'
IDK+100820488+99+Brandenburgische BKK'
VDT+20100101'
@@ -1134,38 +1134,19 @@ IDK+103720893+99+Bertelsmann BKK/Ost'
VDT+20070701'
FKT+01'
VKG+01+103720893+5++++++00'
VKG+03+661430035+5++07++++10'
VKG+03+661430035+5++07++++20'
VKG+03+661430035+5++07++++30'
VKG+03+661430035+5++07++++40'
VKG+03+661430035+5++07++++50'
VKG+03+661430035+5++07++++55'
VKG+03+661430035+5++07++++56'
VKG+03+661430035+5++07++++57'
VKG+03+661430035+5++07++++61'
VKG+03+661430035+5++07++++62'
VKG+03+661430035+5++07++++63'
VKG+03+661430035+5++07++++65'
VKG+03+661430035+5++07++++66'
VKG+03+661430035+5++07++++67'
VKG+03+661430035+5++07++++68'
VKG+03+661430035+5++07++++69'
VKG+03+661430035+5++07++++71'
VKG+03+661430035+5++07++++72'
VKG+03+661430035+5++07++++73'
VKG+03+661430035+5++07++++74'
VKG+03+661430035+5++07++++75'
VKG+03+104027544+5++07++++76'
VKG+09+103725342+5++28++++76'
VKG+09+103725342+5++29++++76'
VKG+03+104027544+5++07++++90'
VKG+09+103725342+5++28++++90'
VKG+09+103725342+5++29++++90'
VKG+09+661430035+5++28++++99'
VKG+09+661430035+5++29++++99'
VKG+03+104027544+5++07++++B1'
VKG+09+103725342+5++28++++B1'
VKG+09+103725342+5++29++++B1'
VKG+03+107436557+5++07++++99'
VKG+09+107436557+5++28++++99'
VKG+09+107436557+5++29++++99'
NAM+01+Bertelsmann+Betriebskrankenkasse+Gesch.Ber.Neue Bundesländer'
ANS+1+33335+Gütersloh+Carl-Miele-Str. 214'
ANS+2+33311+Gütersloh+170'
UNT+000037+00074'
UNT+000018+00074'
UNH+00075+KOTR:02:001:KV'
IDK+103723317+99+BKK MIELE Ost'
VDT+20100401'
@@ -1189,202 +1170,165 @@ IDK+103723896+99+Heimat Krankenkasse/Ost'
VDT+20120101'
FKT+01'
VKG+01+103723896+5++++++00'
VKG+03+661430035+5++07++++10'
VKG+03+661430035+5++07++++20'
VKG+03+661430035+5++07++++30'
VKG+03+661430035+5++07++++40'
VKG+03+661430035+5++07++++50'
VKG+03+661430035+5++07++++55'
VKG+03+661430035+5++07++++56'
VKG+03+661430035+5++07++++57'
VKG+03+661430035+5++07++++61'
VKG+03+661430035+5++07++++62'
VKG+03+661430035+5++07++++63'
VKG+03+661430035+5++07++++65'
VKG+03+661430035+5++07++++66'
VKG+03+661430035+5++07++++67'
VKG+03+661430035+5++07++++68'
VKG+03+661430035+5++07++++69'
VKG+03+661430035+5++07++++71'
VKG+03+661430035+5++07++++72'
VKG+03+661430035+5++07++++73'
VKG+03+661430035+5++07++++74'
VKG+09+103724238+5++28++++75'
VKG+09+103724238+5++29++++75'
VKG+03+104027544+5++07++++76'
VKG+09+103724238+5++28++++76'
VKG+09+103724238+5++29++++76'
VKG+03+104027544+5++07++++66'
VKG+03+103724238+5++28++++66'
VKG+03+103724238+5++29++++66'
VKG+03+104027544+5++07++++90'
VKG+09+103724238+5++28++++90'
VKG+09+103724238+5++29++++90'
VKG+03+104027544+5++07++++A0'
VKG+09+103724238+5++28++++A0'
VKG+09+103724238+5++29++++A0'
VKG+03+104027544+5++07++++B1'
VKG+09+103724238+5++28++++B1'
VKG+09+103724238+5++29++++B1'
VKG+09+661430035+5++28++++99'
VKG+09+661430035+5++29++++99'
VKG+03+107436557+5++07++++99'
VKG+09+107436557+5++28++++99'
VKG+09+107436557+5++29++++99'
NAM+01+Heimat+Krankenkasse+Gesch.Ber.Neue Bundesländer'
ANS+1+33602+Bielefeld+Herforder Str. 23'
UNT+000042+00076'
UNT+000023+00076'
UNH+00077+KOTR:02:001:KV'
IDK+103724238+99+Heimat Krankenkasse'
VDT+20120101'
FKT+01'
VKG+01+103724238+5++++++00'
VKG+03+661430035+5++07++++10'
VKG+03+661430035+5++07++++20'
VKG+03+661430035+5++07++++30'
VKG+03+661430035+5++07++++40'
VKG+03+661430035+5++07++++50'
VKG+03+661430035+5++07++++55'
VKG+03+661430035+5++07++++56'
VKG+03+661430035+5++07++++57'
VKG+03+661430035+5++07++++61'
VKG+03+661430035+5++07++++62'
VKG+03+661430035+5++07++++63'
VKG+03+661430035+5++07++++65'
VKG+03+661430035+5++07++++66'
VKG+03+661430035+5++07++++67'
VKG+03+661430035+5++07++++68'
VKG+03+661430035+5++07++++69'
VKG+03+661430035+5++07++++71'
VKG+03+661430035+5++07++++72'
VKG+03+661430035+5++07++++73'
VKG+03+661430035+5++07++++74'
VKG+09+103724238+5++28++++75'
VKG+09+103724238+5++29++++75'
VKG+03+104027544+5++07++++76'
VKG+09+103724238+5++28++++76'
VKG+09+103724238+5++29++++76'
VKG+03+104027544+5++07++++66'
VKG+03+103724238+5++28++++66'
VKG+03+103724238+5++29++++66'
VKG+03+104027544+5++07++++90'
VKG+09+103724238+5++28++++90'
VKG+09+103724238+5++29++++90'
VKG+03+104027544+5++07++++A0'
VKG+09+103724238+5++28++++A0'
VKG+09+103724238+5++29++++A0'
VKG+03+104027544+5++07++++B1'
VKG+09+103724238+5++28++++B1'
VKG+09+103724238+5++29++++B1'
VKG+09+661430035+5++28++++99'
VKG+09+661430035+5++29++++99'
VKG+03+107436557+5++07++++99'
VKG+09+107436557+5++28++++99'
VKG+09+107436557+5++29++++99'
NAM+01+Heimat+Krankenkasse'
ANS+1+33602+Bielefeld+Herforder Str. 23'
UNT+000042+00077'
UNT+000023+00077'
UNH+00078+KOTR:02:001:KV'
IDK+103724249+99+BKK_DürkoppAdler'
VDT+20120525'
FKT+01'
VKG+01+103724249+5++++++00'
VKG+03+661430035+5++07++++10'
VKG+03+661430035+5++07++++20'
VKG+03+661430035+5++07++++30'
VKG+03+661430035+5++07++++40'
VKG+03+661430035+5++07++++50'
VKG+03+661430035+5++07++++55'
VKG+03+661430035+5++07++++56'
VKG+03+661430035+5++07++++57'
VKG+03+661430035+5++07++++61'
VKG+03+661430035+5++07++++62'
VKG+03+661430035+5++07++++63'
VKG+03+661430035+5++07++++65'
VKG+03+661430035+5++07++++66'
VKG+03+661430035+5++07++++67'
VKG+03+661430035+5++07++++68'
VKG+09+103724249+5++28++++69'
VKG+09+103724249+5++29++++69'
VKG+03+661430035+5++07++++71'
VKG+03+661430035+5++07++++72'
VKG+03+661430035+5++07++++73'
VKG+03+661430035+5++07++++74'
VKG+09+103724249+5++28++++75'
VKG+09+103724249+5++29++++75'
VKG+03+661430035+5++07++++76'
VKG+03+107436557+5++07++++10'
VKG+03+107436557+5++07++++20'
VKG+03+107436557+5++07++++30'
VKG+03+107436557+5++07++++40'
VKG+03+107436557+5++07++++50'
VKG+03+107436557+5++07++++55'
VKG+03+107436557+5++07++++56'
VKG+03+107436557+5++07++++57'
VKG+03+107436557+5++07++++61'
VKG+03+107436557+5++07++++62'
VKG+03+107436557+5++07++++63'
VKG+03+107436557+5++07++++65'
VKG+03+107436557+5++07++++66'
VKG+03+107436557+5++07++++67'
VKG+03+107436557+5++07++++68'
VKG+09+107436557+5++07++++69'
VKG+03+107436557+5++07++++71'
VKG+03+107436557+5++07++++72'
VKG+03+107436557+5++07++++73'
VKG+03+107436557+5++07++++74'
VKG+09+107436557+5++07++++75'
VKG+03+107436557+5++07++++76'
VKG+09+103724249+5++28++++90'
VKG+09+103724249+5++29++++90'
VKG+09+103724249+5++28++++A0'
VKG+09+103724249+5++29++++A0'
VKG+09+107436557+5++07++++A0'
VKG+09+103724249+5++28++++B1'
VKG+09+103724249+5++29++++B1'
VKG+09+661430035+5++28++++99'
VKG+09+661430035+5++29++++99'
VKG+09+107436557+5++28++++99'
VKG+09+107436557+5++29++++99'
NAM+01+Betriebskrankenkasse+Dürkopp Adler'
ANS+1+33605+Bielefeld+Stieghorster Str. 66'
ANS+2+33697+Bielefeld+219140'
UNT+000040+00078'
UNT+000038+00078'
UNH+00079+KOTR:02:001:KV'
IDK+103724272+99+BKK GILDEMEISTER SEIDENSTICKER'
VDT+20110701'
FKT+01'
VKG+01+103724272+5++++++00'
VKG+03+661430035+5++07++++10'
VKG+03+661430035+5++07++++20'
VKG+03+661430035+5++07++++30'
VKG+03+661430035+5++07++++40'
VKG+03+661430035+5++07++++50'
VKG+03+661430035+5++07++++55'
VKG+03+661430035+5++07++++56'
VKG+03+661430035+5++07++++57'
VKG+03+661430035+5++07++++61'
VKG+03+661430035+5++07++++62'
VKG+03+661430035+5++07++++63'
VKG+03+661430035+5++07++++65'
VKG+03+661430035+5++07++++66'
VKG+03+661430035+5++07++++67'
VKG+03+661430035+5++07++++68'
VKG+03+661430035+5++07++++69'
VKG+03+661430035+5++07++++71'
VKG+03+661430035+5++07++++72'
VKG+03+661430035+5++07++++73'
VKG+03+661430035+5++07++++74'
VKG+03+661430035+5++07++++75'
VKG+03+661430035+5++07++++76'
VKG+03+107436557+5++07++++10'
VKG+03+107436557+5++07++++20'
VKG+03+107436557+5++07++++30'
VKG+03+107436557+5++07++++40'
VKG+03+107436557+5++07++++50'
VKG+03+107436557+5++07++++55'
VKG+03+107436557+5++07++++56'
VKG+03+107436557+5++07++++57'
VKG+03+107436557+5++07++++61'
VKG+03+107436557+5++07++++62'
VKG+03+107436557+5++07++++63'
VKG+03+107436557+5++07++++65'
VKG+03+107436557+5++07++++66'
VKG+03+107436557+5++07++++67'
VKG+03+107436557+5++07++++68'
VKG+03+107436557+5++07++++69'
VKG+03+107436557+5++07++++71'
VKG+03+107436557+5++07++++72'
VKG+03+107436557+5++07++++73'
VKG+03+107436557+5++07++++74'
VKG+03+107436557+5++07++++75'
VKG+03+107436557+5++07++++76'
VKG+09+103724272+5++28++++90'
VKG+09+103724272+5++29++++90'
VKG+09+103724272+5++28++++A0'
VKG+09+103724272+5++29++++A0'
VKG+03+107436557+5++07++++A0'
VKG+09+103724272+5++28++++B1'
VKG+09+103724272+5++29++++B1'
VKG+09+661430035+5++28++++99'
VKG+09+661430035+5++29++++99'
VKG+09+107436557+5++28++++99'
VKG+09+107436557+5++29++++99'
NAM+01+Betriebskrankenkasse+Gildemeister Seidensticker'
ANS+1+33649+Bielefeld+Winterstr. 49'
ANS+2+33621+Bielefeld+140160'
UNT+000039+00079'
UNT+000038+00079'
UNH+00080+KOTR:02:001:KV'
IDK+103724294+99+BKK Diakonie'
VDT+20080101'
FKT+01'
VKG+01+103724294+5++++++00'
VKG+03+661430035+5++07++++10'
VKG+03+661430035+5++07++++20'
VKG+03+661430035+5++07++++30'
VKG+03+661430035+5++07++++40'
VKG+03+661430035+5++07++++50'
VKG+03+661430035+5++07++++55'
VKG+03+661430035+5++07++++56'
VKG+03+661430035+5++07++++57'
VKG+03+661430035+5++07++++61'
VKG+03+661430035+5++07++++62'
VKG+03+661430035+5++07++++63'
VKG+03+661430035+5++07++++65'
VKG+03+661430035+5++07++++66'
VKG+03+661430035+5++07++++67'
VKG+03+661430035+5++07++++68'
VKG+03+107436557+5++07++++10'
VKG+03+107436557+5++07++++20'
VKG+03+107436557+5++07++++30'
VKG+03+107436557+5++07++++40'
VKG+03+107436557+5++07++++50'
VKG+03+107436557+5++07++++55'
VKG+03+107436557+5++07++++56'
VKG+03+107436557+5++07++++57'
VKG+03+107436557+5++07++++61'
VKG+03+107436557+5++07++++62'
VKG+03+107436557+5++07++++63'
VKG+03+107436557+5++07++++65'
VKG+03+107436557+5++07++++66'
VKG+03+107436557+5++07++++67'
VKG+03+107436557+5++07++++68'
VKG+09+103724294+5++28++++69'
VKG+09+103724294+5++29++++69'
VKG+03+661430035+5++07++++71'
VKG+03+661430035+5++07++++72'
VKG+03+661430035+5++07++++73'
VKG+03+661430035+5++07++++74'
VKG+03+661430035+5++07++++75'
VKG+03+107436557+5++07++++71'
VKG+03+107436557+5++07++++72'
VKG+03+107436557+5++07++++73'
VKG+03+107436557+5++07++++74'
VKG+03+107436557+5++07++++75'
VKG+03+104027544+5++07++++76'
VKG+09+103724294+5++28++++76'
VKG+09+103724294+5++29++++76'
VKG+03+104027544+5++07++++90'
VKG+09+103724294+5++28++++90'
VKG+09+103724294+5++29++++90'
VKG+09+661430035+5++28++++99'
VKG+09+661430035+5++29++++99'
VKG+03+107436557+5++07++++A0'
VKG+09+103724294+5++28++++B1'
VKG+09+103724294+5++29++++B1'
VKG+09+107436557+5++28++++99'
VKG+09+107436557+5++29++++99'
NAM+01+Betriebskrankenkasse+Diakonie'
ANS+1+33617+Bielefeld+Königsweg 8'
ANS+2+33544+Bielefeld+130104'
UNT+000038+00080'
UNT+000042+00080'
UNH+00081+KOTR:02:001:KV'
IDK+103724341+99+BKK GILDEMEISTER SEIDENSTICKER'
VDT+20110701'
@@ -1426,38 +1370,19 @@ IDK+103725342+99+Bertelsmann BKK'
VDT+20070701'
FKT+01'
VKG+01+103725342+5++++++00'
VKG+03+661430035+5++07++++10'
VKG+03+661430035+5++07++++20'
VKG+03+661430035+5++07++++30'
VKG+03+661430035+5++07++++40'
VKG+03+661430035+5++07++++50'
VKG+03+661430035+5++07++++55'
VKG+03+661430035+5++07++++56'
VKG+03+661430035+5++07++++57'
VKG+03+661430035+5++07++++61'
VKG+03+661430035+5++07++++62'
VKG+03+661430035+5++07++++63'
VKG+03+661430035+5++07++++65'
VKG+03+661430035+5++07++++66'
VKG+03+661430035+5++07++++67'
VKG+03+661430035+5++07++++68'
VKG+03+661430035+5++07++++69'
VKG+03+661430035+5++07++++71'
VKG+03+661430035+5++07++++72'
VKG+03+661430035+5++07++++73'
VKG+03+661430035+5++07++++74'
VKG+03+661430035+5++07++++75'
VKG+03+104027544+5++07++++76'
VKG+09+103725342+5++28++++76'
VKG+09+103725342+5++29++++76'
VKG+03+104027544+5++07++++90'
VKG+09+103725342+5++28++++90'
VKG+09+103725342+5++29++++90'
VKG+09+661430035+5++28++++99'
VKG+09+661430035+5++29++++99'
VKG+03+104027544+5++07++++B1'
VKG+09+103725342+5++28++++B1'
VKG+09+103725342+5++29++++B1'
VKG+03+107436557+5++07++++99'
VKG+09+107436557+5++28++++99'
VKG+09+107436557+5++29++++99'
NAM+01+Bertelsmann+Betriebskrankenkasse'
ANS+1+33335+Gütersloh+Carl-Miele-Str. 214'
ANS+2+33311+Gütersloh+170'
UNT+000037+00085'
UNT+000018+00085'
UNH+00086+KOTR:02:001:KV'
IDK+103725364+99+BKK Miele'
VDT+20100401'
@@ -1490,80 +1415,80 @@ IDK+103726081+99+BKK Melitta HMR'
VDT+20100701'
FKT+01'
VKG+01+103726081+5++++++00'
VKG+03+661430035+5++07++++10'
VKG+03+661430035+5++07++++20'
VKG+03+661430035+5++07++++30'
VKG+03+661430035+5++07++++40'
VKG+03+661430035+5++07++++50'
VKG+03+661430035+5++07++++55'
VKG+03+661430035+5++07++++56'
VKG+03+661430035+5++07++++57'
VKG+03+661430035+5++07++++61'
VKG+03+661430035+5++07++++62'
VKG+03+661430035+5++07++++63'
VKG+03+661430035+5++07++++65'
VKG+03+661430035+5++07++++66'
VKG+03+661430035+5++07++++67'
VKG+03+661430035+5++07++++68'
VKG+03+661430035+5++07++++71'
VKG+03+661430035+5++07++++72'
VKG+03+661430035+5++07++++73'
VKG+03+661430035+5++07++++74'
VKG+03+661430035+5++07++++76'
VKG+09+103726081+5++28++++69'
VKG+09+103726081+5++29++++69'
VKG+09+103726081+5++28++++75'
VKG+09+103726081+5++29++++75'
VKG+03+107436557+5++07++++10'
VKG+03+107436557+5++07++++20'
VKG+03+107436557+5++07++++30'
VKG+03+107436557+5++07++++40'
VKG+03+107436557+5++07++++50'
VKG+03+107436557+5++07++++55'
VKG+03+107436557+5++07++++56'
VKG+03+107436557+5++07++++57'
VKG+03+107436557+5++07++++61'
VKG+03+107436557+5++07++++62'
VKG+03+107436557+5++07++++63'
VKG+03+107436557+5++07++++65'
VKG+03+107436557+5++07++++66'
VKG+03+107436557+5++07++++67'
VKG+03+107436557+5++07++++68'
VKG+03+107436557+5++07++++71'
VKG+03+107436557+5++07++++72'
VKG+03+107436557+5++07++++73'
VKG+03+107436557+5++07++++74'
VKG+03+107436557+5++07++++75'
VKG+03+107436557+5++07++++76'
VKG+09+103726081+5++28++++90'
VKG+09+103726081+5++29++++90'
VKG+09+103726081+5++28++++A0'
VKG+09+103726081+5++29++++A0'
VKG+03+107436557+5++07++++A0'
VKG+09+103726081+5++28++++B1'
VKG+09+103726081+5++29++++B1'
VKG+09+661430035+5++28++++99'
VKG+09+661430035+5++29++++99'
VKG+09+107436557+5++28++++99'
VKG+09+107436557+5++29++++99'
NAM+01+Betriebskrankenkasse+Melitta HMR'
ANS+1+32425+Minden+Marienstr. 122'
ANS+2+32372+Minden+1224'
UNT+000041+00088'
UNT+000037+00088'
UNH+00089+KOTR:02:001:KV'
IDK+103729701+99+BKK Diakonie/Ost'
VDT+20080101'
FKT+01'
VKG+01+103729701+5++++++00'
VKG+03+661430035+5++07++++10'
VKG+03+661430035+5++07++++20'
VKG+03+661430035+5++07++++30'
VKG+03+661430035+5++07++++40'
VKG+03+661430035+5++07++++50'
VKG+03+661430035+5++07++++55'
VKG+03+661430035+5++07++++56'
VKG+03+661430035+5++07++++57'
VKG+03+661430035+5++07++++61'
VKG+03+661430035+5++07++++62'
VKG+03+661430035+5++07++++63'
VKG+03+661430035+5++07++++65'
VKG+03+661430035+5++07++++66'
VKG+03+661430035+5++07++++67'
VKG+03+661430035+5++07++++68'
VKG+03+107436557+5++07++++10'
VKG+03+107436557+5++07++++20'
VKG+03+107436557+5++07++++30'
VKG+03+107436557+5++07++++40'
VKG+03+107436557+5++07++++50'
VKG+03+107436557+5++07++++55'
VKG+03+107436557+5++07++++56'
VKG+03+107436557+5++07++++57'
VKG+03+107436557+5++07++++61'
VKG+03+107436557+5++07++++62'
VKG+03+107436557+5++07++++63'
VKG+03+107436557+5++07++++65'
VKG+03+107436557+5++07++++66'
VKG+03+107436557+5++07++++67'
VKG+03+107436557+5++07++++68'
VKG+09+103724294+5++28++++69'
VKG+09+103724294+5++29++++69'
VKG+03+661430035+5++07++++71'
VKG+03+661430035+5++07++++72'
VKG+03+661430035+5++07++++73'
VKG+03+661430035+5++07++++74'
VKG+03+661430035+5++07++++75'
VKG+03+107436557+5++07++++71'
VKG+03+107436557+5++07++++72'
VKG+03+107436557+5++07++++73'
VKG+03+107436557+5++07++++74'
VKG+03+107436557+5++07++++75'
VKG+03+104027544+5++07++++76'
VKG+09+103724294+5++28++++76'
VKG+09+103724294+5++29++++76'
VKG+03+104027544+5++07++++90'
VKG+09+103724294+5++28++++90'
VKG+09+103724294+5++29++++90'
VKG+09+661430035+5++28++++99'
VKG+09+661430035+5++29++++99'
VKG+03+107436557+5++07++++A0'
VKG+09+103724294+5++28++++B1'
VKG+09+103724294+5++29++++B1'
VKG+09+107436557+5++28++++99'
VKG+09+107436557+5++29++++99'
NAM+01+Betriebskrankenkasse+Diakonie/Ost+Gesch.Ber.Neue Bundesländer'
ANS+1+33617+Bielefeld+Königsweg 8'
ANS+2+33544+Bielefeld+130104'
UNT+000038+00089'
UNT+000042+00089'
UNH+00090+KOTR:02:001:KV'
IDK+103736722+99+BKK HMR/Ost'
VDT+20110101'
@@ -1578,40 +1503,39 @@ IDK+103791489+99+BKK GILDEMEISTER SEIDENST./Ost'
VDT+20110701'
FKT+01'
VKG+01+103791489+5++++++00'
VKG+03+661430035+5++07++++10'
VKG+03+661430035+5++07++++20'
VKG+03+661430035+5++07++++30'
VKG+03+661430035+5++07++++40'
VKG+03+661430035+5++07++++50'
VKG+03+661430035+5++07++++55'
VKG+03+661430035+5++07++++56'
VKG+03+661430035+5++07++++57'
VKG+03+661430035+5++07++++61'
VKG+03+661430035+5++07++++62'
VKG+03+661430035+5++07++++63'
VKG+03+661430035+5++07++++65'
VKG+03+661430035+5++07++++66'
VKG+03+661430035+5++07++++67'
VKG+03+661430035+5++07++++68'
VKG+03+661430035+5++07++++69'
VKG+03+661430035+5++07++++71'
VKG+03+661430035+5++07++++72'
VKG+03+661430035+5++07++++73'
VKG+03+661430035+5++07++++74'
VKG+03+661430035+5++07++++75'
VKG+03+661430035+5++07++++76'
VKG+03+107436557+5++07++++10'
VKG+03+107436557+5++07++++20'
VKG+03+107436557+5++07++++30'
VKG+03+107436557+5++07++++40'
VKG+03+107436557+5++07++++50'
VKG+03+107436557+5++07++++55'
VKG+03+107436557+5++07++++56'
VKG+03+107436557+5++07++++57'
VKG+03+107436557+5++07++++61'
VKG+03+107436557+5++07++++62'
VKG+03+107436557+5++07++++63'
VKG+03+107436557+5++07++++65'
VKG+03+107436557+5++07++++66'
VKG+03+107436557+5++07++++67'
VKG+03+107436557+5++07++++68'
VKG+03+107436557+5++07++++69'
VKG+03+107436557+5++07++++71'
VKG+03+107436557+5++07++++72'
VKG+03+107436557+5++07++++73'
VKG+03+107436557+5++07++++74'
VKG+03+107436557+5++07++++75'
VKG+03+107436557+5++07++++76'
VKG+09+103724272+5++28++++90'
VKG+09+103724272+5++29++++90'
VKG+09+103724272+5++28++++A0'
VKG+09+103724272+5++29++++A0'
VKG+03+107436557+5++07++++A0'
VKG+09+103724272+5++28++++B1'
VKG+09+103724272+5++29++++B1'
VKG+09+661430035+5++28++++99'
VKG+09+661430035+5++29++++99'
VKG+09+107436557+5++28++++99'
VKG+09+107436557+5++29++++99'
NAM+01+Betriebskrankenkasse+Gildemeister Seidensticker+Gesch.Ber.Neue Bundesländer'
ANS+1+33649+Bielefeld+Winterstr. 49'
ANS+2+33621+Bielefeld+140160'
UNT+000039+00091'
UNT+000038+00091'
UNH+00092+KOTR:02:001:KV'
IDK+103791490+99+BKK GILDEMEISTER SEIDENSTICKER'
VDT+20110701'
@@ -2152,7 +2076,7 @@ VKG+09+104926702+5++29++++66'
VKG+03+104027544+5++07++++67'
VKG+09+104926702+5++28++++67'
VKG+09+104926702+5++29++++67'
VKG+03+104027544+5++07++++68'
VKG+03+107436557+5++07++++68'
VKG+09+107436557+5++28++++68'
VKG+09+107436557+5++29++++68'
VKG+03+104027544+5++07++++69'
@@ -2459,67 +2383,55 @@ IDK+105734543+99+BKK Wirtschaft & Finanzen'
VDT+20100101'
FKT+01'
VKG+01+105734543+5++++++00'
VKG+03+104027544+5++07++++76'
VKG+09+105734543+5++28++++76'
VKG+09+105734543+5++29++++76'
VKG+03+104027544+5++07++++90'
VKG+09+105734543+5++28++++90'
VKG+09+105734543+5++29++++90'
VKG+03+104027544+5++07++++A0'
VKG+09+105734543+5++28++++A0'
VKG+09+105734543+5++29++++A0'
VKG+03+104027544+5++07++++B1'
VKG+09+105734543+5++28++++B1'
VKG+09+105734543+5++29++++B1'
VKG+03+661430035+5++07++++99'
VKG+09+661430035+5++28++++99'
VKG+09+661430035+5++29++++99'
VKG+03+107436557+5++07++++99'
VKG+09+107436557+5++28++++99'
VKG+09+107436557+5++29++++99'
NAM+01+Die BKK für wirschaftsprüfende+und -beratende Berufe'
ANS+1+34212+Melsungen+Bahnhofstr. 19'
ANS+2+34202+Melsungen+1264'
UNT+000024+00144'
UNT+000018+00144'
UNH+00145+KOTR:02:001:KV'
IDK+105734554+99+BKK Wirtschaft & Finanzen WT'
VDT+20100101'
IDK+108433204+99+BKK MAN und MTU Muenchen'
VDT+19560401+20111231'
FKT+01'
VKG+01+105734543+5++++++00'
NAM+01+Die BKK f<> wirschaftspr<70>ende+und -beratende Berufe+Wahltarif'
ANS+1+34212+Melsungen+Bahnhofstr. 19'
ANS+2+34202+Melsungen+1264'
VKG+01+108534160+5++++++00'
NAM+01+Betriebskrankenkasse+MAN und MTU München'
ANS+1+80995+München+Karlsfelder Str. 209e-f'
ANS+2+80971+München+500144'
UNT+000009+00145'
UNH+00146+KOTR:02:001:KV'
IDK+105734565+99+BKK Wirtschaft & Finanzen/Ost'
VDT+20100101'
IDK+105230383+99+BKK ENKA'
VDT+20000801+20101231'
FKT+01'
VKG+01+105792123+5++++++00'
NAM+01+Die BKK f<> wirschaftspr<70>ende+und -beratende Berufe+Wahltarif'
ANS+1+34212+Melsungen+Bahnhofstr. 19'
ANS+2+34202+Melsungen+1264'
VKG+01+105330191+5++++++00'
NAM+01+Betriebskrankenkasse+ENKA'
ANS+1+65451+Kelsterbach+Kleiner Kornweg 2'
ANS+2+65440+Kelsterbach+1110'
UNT+000009+00146'
UNH+00147+KOTR:02:001:KV'
IDK+105792123+99+BKK Wirtschaft & Finanzen/Ost'
VDT+20100101'
FKT+01'
VKG+01+105792123+5++++++00'
VKG+03+104027544+5++07++++76'
VKG+09+105792123+5++28++++76'
VKG+09+105792123+5++29++++76'
VKG+03+104027544+5++07++++90'
VKG+09+105792123+5++28++++90'
VKG+09+105792123+5++29++++90'
VKG+03+104027544+5++07++++A0'
VKG+09+105792123+5++28++++A0'
VKG+09+105792123+5++29++++A0'
VKG+03+104027544+5++07++++B1'
VKG+09+105792123+5++28++++B1'
VKG+09+105792123+5++29++++B1'
VKG+03+661430035+5++07++++99'
VKG+09+661430035+5++28++++99'
VKG+09+661430035+5++29++++99'
VKG+03+107436557+5++07++++99'
VKG+09+107436557+5++28++++99'
VKG+09+107436557+5++29++++99'
NAM+01+Die BKK für wirschaftsprüfende+und -beratende Berufe+Gesch.Ber.Neue Bundesländer'
ANS+1+34212+Melsungen+Bahnhofstr. 19'
ANS+2+34202+Melsungen+1264'
UNT+000024+00147'
UNT+000018+00147'
UNH+00148+KOTR:02:001:KV'
IDK+105792190+99+BKK PwC/Ost'
VDT+20090101'
@@ -3656,14 +3568,14 @@ ANS+1+01445+Radebeul+Ledenweg 2'
ANS+2+01439+Radebeul+020108'
UNT+000009+00191'
UNH+00192+KOTR:02:001:KV'
IDK+108021400+99+WMF Betriebskrankenkasse/OST'
IDK+108021400+99+WMF BKK/OST'
VDT+20060701'
FKT+01'
VKG+01+108021400+5++++++00'
VKG+03+107436557+5++07++++00'
VKG+09+107436557+5++28++++00'
VKG+09+107436557+5++29++++00'
NAM+01+WMF Betriebskrankenkasse+Gesch.Ber.Neue Bundeslder'
NAM+01+WMF BKK+Gesch.Ber.Neue Bundesländer'
ANS+1+73312+Geislingen+Eberhardstr.'
ANS+2+73304+Geislingen+1412'
UNT+000012+00192'
@@ -4108,14 +4020,14 @@ ANS+1+70376+Stuttgart+Pragstr. 26-46'
ANS+2+70369+Stuttgart+500780'
UNT+000018+00220'
UNH+00221+KOTR:02:001:KV'
IDK+108036441+99+WMF Betriebskrankenkasse'
IDK+108036441+99+WMF BKK'
VDT+20060701'
FKT+01'
VKG+01+108036441+5++++++00'
VKG+03+107436557+5++07++++00'
VKG+09+107436557+5++28++++00'
VKG+09+107436557+5++29++++00'
NAM+01+WMF Betriebskrankenkasse'
NAM+01+WMF BKK'
ANS+1+73312+Geislingen+Eberhardstraße'
ANS+2+73304+Geislingen+1412'
UNT+000012+00221'
@@ -4647,51 +4559,11 @@ UNH+00255+KOTR:02:001:KV'
IDK+108632900+99+BKK Textilgruppe Hof'
VDT+20100401'
FKT+01'
VKG+01+108632900+5++++++00'
VKG+03+107436557+5++07++++10'
VKG+03+107436557+5++07++++20'
VKG+03+104027544+5++07++++30'
VKG+09+108632900+5++28++++30'
VKG+09+108632900+5++29++++30'
VKG+03+107436557+5++07++++40'
VKG+09+107436557+5++28++++40'
VKG+09+107436557+5++29++++40'
VKG+03+107436557+5++07++++50'
VKG+03+107436557+5++07++++55'
VKG+03+107436557+5++07++++56'
VKG+03+107436557+5++07++++57'
VKG+03+107436557+5++07++++61'
VKG+03+107436557+5++07++++62'
VKG+03+107436557+5++07++++63'
VKG+03+107436557+5++07++++65'
VKG+03+107436557+5++07++++66'
VKG+03+107436557+5++07++++67'
VKG+03+107436557+5++07++++68'
VKG+03+107436557+5++07++++69'
VKG+03+107436557+5++07++++71'
VKG+03+107436557+5++07++++72'
VKG+03+107436557+5++07++++73'
VKG+03+107436557+5++07++++74'
VKG+03+104027544+5++07++++75'
VKG+09+108632900+5++28++++75'
VKG+09+108632900+5++29++++75'
VKG+03+104027544+5++07++++76'
VKG+09+108632900+5++28++++76'
VKG+09+108632900+5++29++++76'
VKG+03+104027544+5++07++++90'
VKG+09+108632900+5++28++++90'
VKG+09+108632900+5++29++++90'
VKG+03+104027544+5++07++++A0'
VKG+09+108632900+5++28++++A0'
VKG+09+108632900+5++29++++A0'
VKG+09+108632900+5++28++++B1'
VKG+09+108632900+5++29++++B1'
VKG+09+107436557+5++28++++99'
VKG+09+107436557+5++29++++99'
VKG+01+108035612+5++++++00'
NAM+01+Gemeinsame Betriebskranken-+kasse der Gesellschaften+der textilgruppe hof'
ANS+1+95028+Hof+Fabrikzeile 21'
ANS+2+95014+Hof+1529'
UNT+000049+00255'
UNT+000009+00255'
UNH+00256+KOTR:02:001:KV'
IDK+108633433+99+BKK Kassana'
VDT+20110801'
@@ -5897,8 +5769,8 @@ IDK+107436557+99+AZE Emmendingen'
VDT+20000401'
FKT+01'
NAM+01+Abrechnungszentrum Emmendingen'
ANS+1+79312+Emmendingen+An der B3 Haus-Nr. 6'
ANS+2+79301+Emmendingen+1167'
ANS+1+79312+Emmendingen+Bundesstraße 6'
ANS+2+79312+Emmendingen+An der B3 Haus Nr. 6'
UEM+1+00+I8'
DFU+01+070+++++inbox@tp5.arz-emmendingen.de'
DFU+02+016+++++ftam.arz-emmendingen.de?:9000'
@@ -6151,15 +6023,6 @@ NAM+01+ktp - Betriebskrankenkasse+Gesch.Ber.Neue Bundesl
ANS+1+45138+Essen+Kurfürstenstr. 58'
UNT+000008+00359'
UNH+00360+KOTR:02:001:KV'
IDK+108433204+99+BKK MAN und MTU Muenchen'
VDT+19560401+20111231'
FKT+01'
VKG+01+108534160+5++++++00'
NAM+01+Betriebskrankenkasse+MAN und MTU M<>chen'
ANS+1+80995+M<>chen+Karlsfelder Str. 209e-f'
ANS+2+80971+M<>chen+500144'
UNT+000009+00360'
UNH+00361+KOTR:02:001:KV'
IDK+104625684+99+GBK KOELN'
VDT+20031001+20101231'
FKT+01'
@@ -6167,8 +6030,8 @@ VKG+01+108035612+5++++++00'
NAM+01+Gemeinsame BKK der+Stadt Köln'
ANS+1+50668+Köln+Jakordenstr. 18-20'
ANS+2+50455+Köln+101534'
UNT+000009+00361'
UNH+00362+KOTR:02:001:KV'
UNT+000009+00360'
UNH+00361+KOTR:02:001:KV'
IDK+104691721+99+GBK KOELN-OST'
VDT+20031001+20101231'
FKT+01'
@@ -6176,8 +6039,8 @@ VKG+01+108034508+5++++++00'
NAM+01+Gemeinsame BKK der+Stadt Köln+Gesch.Ber.Neue Bundesländer'
ANS+1+50668+Köln+Jakordenstr. 18-20'
ANS+2+50455+Köln+101534'
UNT+000009+00362'
UNH+00363+KOTR:02:001:KV'
UNT+000009+00361'
UNH+00362+KOTR:02:001:KV'
IDK+104826197+99+BKK futur'
VDT+20071101+20111231'
FKT+01'
@@ -6185,24 +6048,24 @@ VKG+01+109723913+5++++++00'
NAM+01+Betriebskrankenkasse+futur'
ANS+1+47803+Krefeld+Girmesgath 5'
ANS+3+70426+Stuttgart'
UNT+000009+00363'
UNH+00364+KOTR:02:001:KV'
UNT+000009+00362'
UNH+00363+KOTR:02:001:KV'
IDK+104892110+99+BKK futur (Proj. ZOM)'
VDT+20040715+20111231'
FKT+01'
VKG+01+109723913+5++++++00'
NAM+01+Betriebskrankenkasse+futur+Projekt ZOM'
ANS+1+47803+Krefeld+Girmesgath 5'
UNT+000008+00364'
UNH+00365+KOTR:02:001:KV'
UNT+000008+00363'
UNH+00364+KOTR:02:001:KV'
IDK+104892358+99+BKK futur Mitarbeiterkasse'
VDT+20071101+20111231'
FKT+01'
VKG+01+109723913+5++++++00'
NAM+01+Betriebskrankenkasse+futur+Mitarbeiterkasse'
ANS+2+91701+Gunzenhausen+1101'
UNT+000008+00365'
UNH+00366+KOTR:02:001:KV'
UNT+000008+00364'
UNH+00365+KOTR:02:001:KV'
IDK+104892369+99+BKK futur/Ost'
VDT+20100601+20111231'
FKT+01'
@@ -6210,14 +6073,5 @@ VKG+01+109737010+5++++++00'
NAM+01+Betriebskrankenkasse+futur+Gesch.Ber.Neue Bundesländer'
ANS+1+47803+Krefeld+Girmesgath 5'
ANS+3+70426+Stuttgart'
UNT+000009+00366'
UNH+00367+KOTR:02:001:KV'
IDK+105230383+99+BKK ENKA'
VDT+20000801+20101231'
FKT+01'
VKG+01+105330191+5++++++00'
NAM+01+Betriebskrankenkasse+ENKA'
ANS+1+65451+Kelsterbach+Kleiner Kornweg 2'
ANS+2+65440+Kelsterbach+1110'
UNT+000009+00367'
UNZ+000367+00235'
UNT+000009+00365'
UNZ+000365+00239'

View File

@@ -1,5 +1,5 @@
UNA:+,? '
UNB+UNOC:3+109979990+999999999+240917:1104+00001++EK05Q324KE4'
UNB+UNOC:3+109979990+999999999+241219:1420+00001++EK05Q125KE0'
UNH+00001+KOTR:02:001:KV'
IDK+100167999+99+DAK+78602'
VDT+19951001'
@@ -1121,7 +1121,7 @@ VKG+03+104940005+5++07++16++A0'
VKG+09+660510336+5++28++99++10'
VKG+09+660510336+5++28++99++20'
VKG+09+104940185+5++28++01++30'
VKG+09+104940174+5++28++02++30'
VKG+09+104940185+5++28++02++30'
VKG+09+104940174+5++28++03++30'
VKG+09+104940174+5++28++04++30'
VKG+09+104940174+5++28++05++30'
@@ -1130,14 +1130,14 @@ VKG+09+104940185+5++28++07++30'
VKG+09+104940185+5++28++08++30'
VKG+09+104940185+5++28++09++30'
VKG+09+104940185+5++28++10++30'
VKG+09+104940174+5++28++11++30'
VKG+09+104940174+5++28++12++30'
VKG+09+104940185+5++28++11++30'
VKG+09+104940185+5++28++12++30'
VKG+09+104940185+5++28++13++30'
VKG+09+104940185+5++28++14++30'
VKG+09+104940185+5++28++15++30'
VKG+09+104940185+5++28++16++30'
VKG+09+108079819+5++28++01++40'
VKG+09+104940152+5++28++02++40'
VKG+09+108079819+5++28++02++40'
VKG+09+104940152+5++28++03++40'
VKG+09+104940152+5++28++04++40'
VKG+09+104940152+5++28++05++40'
@@ -1146,8 +1146,8 @@ VKG+09+108079819+5++28++07++40'
VKG+09+108079819+5++28++08++40'
VKG+09+108079819+5++28++09++40'
VKG+09+108079819+5++28++10++40'
VKG+09+104940152+5++28++11++40'
VKG+09+104940152+5++28++12++40'
VKG+09+108079819+5++28++11++40'
VKG+09+108079819+5++28++12++40'
VKG+09+108079819+5++28++13++40'
VKG+09+108079819+5++28++14++40'
VKG+09+108079819+5++28++15++40'
@@ -1167,7 +1167,7 @@ VKG+09+660510336+5++28++99++74'
VKG+09+660510336+5++28++99++75'
VKG+09+660510336+5++28++99++76'
VKG+09+104940185+5++28++01++A0'
VKG+09+104940174+5++28++02++A0'
VKG+09+104940185+5++28++02++A0'
VKG+09+104940174+5++28++03++A0'
VKG+09+104940174+5++28++04++A0'
VKG+09+104940174+5++28++05++A0'
@@ -1176,8 +1176,8 @@ VKG+09+104940185+5++28++07++A0'
VKG+09+104940185+5++28++08++A0'
VKG+09+104940185+5++28++09++A0'
VKG+09+104940185+5++28++10++A0'
VKG+09+104940174+5++28++11++A0'
VKG+09+104940174+5++28++12++A0'
VKG+09+104940185+5++28++11++A0'
VKG+09+104940185+5++28++12++A0'
VKG+09+104940185+5++28++13++A0'
VKG+09+104940185+5++28++14++A0'
VKG+09+104940185+5++28++15++A0'

View File

@@ -1,5 +1,5 @@
UNA:+,? '
UNB+UNOC:3+109900019+999999999+240925:1200+00030++IK05Q424KE0'
UNB+UNOC:3+109900019+999999999+241219:1500+00032++IK05Q125KE1'
UNH+00001+KOTR:02:001:KV'
IDK+100202527+99+IKK Nord (vorm. IKK MV)+78301'
VDT+19950801'
@@ -1579,8 +1579,8 @@ IDK+107436557+99+AZE Emmendingen'
VDT+20000401'
FKT+01'
NAM+01+Abrechenzentrum Emmendingen'
ANS+1+79312+Emmendingen+An der B3 Haus Nr. 6'
ANS+2+79301+Emmendingen+1167'
ANS+1+79312+Emmendingen+Bundesstraße 6'
ANS+2+79312+Emmendingen+An der B3 Haus Nr. 6'
UEM+1+00+I8'
DFU+01+070+++++inbox@tp5.arz-emmendingen.de'
DFU+02+016+++++ftam.arz-emmendingen.de?:9000'
@@ -2300,4 +2300,4 @@ NAM+01+IKK Classic+c/o DAVASO GmbH'
ANS+1+04316+Leipzig+Sommerfelder Str. 120'
ANS+2+04304+Leipzig+500761'
UNT+000008+00227'
UNZ+000227+00030'
UNZ+000227+00032'

View File

@@ -18,9 +18,6 @@ namespace DakotaSender
{
class Program
{
static readonly string TEST_TENANT = "5000000000";
static readonly string TEST_TENANT_2 = "7375324044";
static bool time_in_line = false;
static bool is_dakota_running = false;
@@ -130,7 +127,6 @@ namespace DakotaSender
if (accept)
{
PrintLine("Ok.");
//PrintLine(message);
}
else
{

View File

@@ -46,11 +46,13 @@
<HintPath>..\packages\MSTest.TestFramework.2.1.2\lib\net45\Microsoft.VisualStudio.TestPlatform.TestFramework.Extensions.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Configuration" />
<Reference Include="System.Core" />
</ItemGroup>
<ItemGroup>
<Compile Include="DakotaReaderUnitTest.cs" />
<Compile Include="GkvObjectUnitTest.cs" />
<Compile Include="GkvSumServer.cs" />
<Compile Include="MailUnitTest.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>

View File

@@ -0,0 +1,42 @@
using BS.Shared.AppSender;
using BS.Shared.DataContracts.GkvAbrechnung;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
namespace DakotaUnitTest
{
[TestClass]
public class GkvSumServer
{
[TestInitialize]
public void Initialize()
{
}
[TestMethod]
public void Test()
{
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
var req = new GkvClientSumRequestJson();
req.GkvSecretKey = "DfDGNGn72PKfSYxSUsmRdzuBtpR9novewlmYU3gsjiFgSkaZZeylUXlbO42cWNqiKgLdMUFtWUNZT962F1raQDR7HGUzCNYsFeC";
req.Tenant = "9005111114";
req.Start = new DateTime(2025, 1, 30);
req.End = new DateTime(2025, 1, 30, 10, 0, 0);
var res = AppRequestSender.Send<GkvClientSumRequestJson, GkvClientSumResponseJson>(req, "https://app5.bewoplaner.de/service/GkvAbrechnungClient.aspx");
var test = res.Sum;
Assert.IsTrue(res.Success);
}
}
}

View File

@@ -19,108 +19,108 @@ using NHibernate.Cfg;
namespace BeWo.Data
{
public class ASPHibernateSessionManager : IHttpModule
{
public void Dispose()
{
}
public class ASPHibernateSessionManager : IHttpModule
{
public void Dispose()
{
}
public void Init(HttpApplication context)
{
context.AcquireRequestState += (s, e) =>
{
Thread.CurrentThread.CurrentCulture = new CultureInfo("de-DE");
public void Init(HttpApplication context)
{
context.AcquireRequestState += (s, e) =>
{
Thread.CurrentThread.CurrentCulture = new CultureInfo("de-DE");
if(ShouldConfigureHibernateSession(context))
{
// TEST FOR DEVEXPRESS. PROBLEMS WITH THIS MODULE WHEN USING AJAX!
if(HttpContext.Current.Session == null)
{
return;
}
if (ShouldConfigureHibernateSession(context))
{
// TEST FOR DEVEXPRESS. PROBLEMS WITH THIS MODULE WHEN USING AJAX!
if (HttpContext.Current.Session == null)
{
return;
}
// ---------------------------------------------------------------
if(!ConfigureHibernateSession(context))
{
return;
}
// ---------------------------------------------------------------
if (!ConfigureHibernateSession(context))
{
return;
}
// throw new Exception("Could not configure database. No tenant parameter found");
var userLoaded = TryAuthenticateWithRequestParams(context);
// throw new Exception("Could not configure database. No tenant parameter found");
var userLoaded = TryAuthenticateWithRequestParams(context);
if(!userLoaded)
{
userLoaded = TryAuthenticateWithLoginForm(context);
}
if(!userLoaded)
{
userLoaded = TryAuthenticateWithGkv(context);
}
if (!userLoaded)
{
userLoaded = TryAuthenticateWithLoginForm(context);
}
if(!userLoaded && !(SessionFacade.LoggedInUser?.Oid is null))
{
SessionFacade.LoggedInUser = DAOFactory.GenericDAO.LoadByID<ApplicationUser>(SessionFacade.LoggedInUser.Oid.Value);
}
}
};
if (!userLoaded)
{
userLoaded = TryAuthenticateWithGkv(context);
}
context.EndRequest += (s, e) =>
{
if(HttpContext.Current.Items["hibernateSession"] != null)
{
((ISession) HttpContext.Current.Items["hibernateSession"]).Close();
}
};
}
if (!userLoaded && !(SessionFacade.LoggedInUser?.Oid is null))
{
SessionFacade.LoggedInUser = DAOFactory.GenericDAO.LoadByID<ApplicationUser>(SessionFacade.LoggedInUser.Oid.Value);
}
}
};
private static bool ShouldConfigureHibernateSession(HttpApplication context)
{
if (string.IsNullOrEmpty(context.Request.FilePath))
return false;
context.EndRequest += (s, e) =>
{
if (HttpContext.Current.Items["hibernateSession"] != null)
{
((ISession)HttpContext.Current.Items["hibernateSession"]).Close();
}
};
}
if (context.Request.FilePath.IndexOf("GkvAbrechnungServer.aspx") >= 0)
return false;
private static bool ShouldConfigureHibernateSession(HttpApplication context)
{
if (string.IsNullOrEmpty(context.Request.FilePath))
return false;
if (context.Request.FilePath.IndexOf("Admin.aspx") >= 0)
return false;
if (context.Request.FilePath.IndexOf("GkvAbrechnungServer.aspx") >= 0)
return false;
return true;
}
if (context.Request.FilePath.IndexOf("Admin.aspx") >= 0)
return false;
private static bool ConfigureHibernateSession(HttpApplication context)
{
var lTenant = GetTenant(context);
if(!string.IsNullOrEmpty(lTenant))
{
SessionFacade.Tenant = lTenant;
}
else
{
lTenant = SessionFacade.Tenant;
}
return true;
}
if(string.IsNullOrEmpty(lTenant))
{
return false;
}
var sessionFactory = new Configuration().Configure(context.Server.MapPath(@"Multitenancy\" + lTenant + ".config")).BuildSessionFactory();
XmlConfigurator.Configure();
if(HttpContext.Current.Items.Contains("hibernateSession"))
{
HttpContext.Current.Items.Remove("hibernateSession");
}
private static bool ConfigureHibernateSession(HttpApplication context)
{
var lTenant = GetTenant(context);
HttpContext.Current.Items.Add("hibernateSession", sessionFactory.OpenSession());
if (!string.IsNullOrEmpty(lTenant))
{
SessionFacade.Tenant = lTenant;
}
else
{
lTenant = SessionFacade.Tenant;
}
return true;
}
if (string.IsNullOrEmpty(lTenant))
{
return false;
}
var sessionFactory = new Configuration().Configure(context.Server.MapPath(@"Multitenancy\" + lTenant + ".config")).BuildSessionFactory();
XmlConfigurator.Configure();
if (HttpContext.Current.Items.Contains("hibernateSession"))
{
HttpContext.Current.Items.Remove("hibernateSession");
}
HttpContext.Current.Items.Add("hibernateSession", sessionFactory.OpenSession());
return true;
}
private static String GetTenant(HttpApplication context)
{
{
var lTenant = String.Empty;
String token = context.Request.Params["token"];
@@ -140,201 +140,198 @@ namespace BeWo.Data
lTenant = context.Request.Params["k"];
return lTenant;
}
}
private static bool TryAuthenticateWithRequestParams(HttpApplication context)
{
string lUserName = null;
string lPassword = null;
private static bool TryAuthenticateWithRequestParams(HttpApplication context)
{
string lUserName = null;
string lPassword = null;
//if (!context.Request.Params.AllKeys.Contains("tenant"))
// return false;
var lTenant = GetTenant(context);
//if (!context.Request.Params.AllKeys.Contains("tenant"))
// return false;
var lTenant = GetTenant(context);
if (!string.IsNullOrEmpty(lTenant))
{
if (context.Request.Params.AllKeys.Contains("token"))
{
lUserName = GetLoginInfoFromToken(context.Request.Params["token"])["user"];
lPassword = GetLoginInfoFromToken(context.Request.Params["token"])["password"];
}
}
else
{
lUserName = context.Request.Params["username"];
lPassword = context.Request.Params["token"];
}
if (!BS.Shared.Core.Utils.IsAnyNullOrEmpty(lUserName, lPassword))
{
var ip = context.Request.UserHostAddress;
var lUser = DAOFactory.UserDAO.FindUserByLoginName(lUserName, ip);
if (lUser != null && lUser.CheckRC2Password(lPassword))
{
SessionFacade.LoggedInUser = lUser;
return true;
}
}
return false;
}
private static bool TryAuthenticateWithLoginForm(HttpApplication context)
{
var name = context.Request.Params["ctl00$tb_login"];
var password = context.Request.Params["ctl00$tb_password"];
if (!BS.Shared.Core.Utils.IsAnyNullOrEmpty(name, password))
{
ApplicationUser user = DAOFactory.UserDAO.FindUserByLoginName(name);
if (user != null && DAOFactory.UserDAO.CheckPassword(user, password))
{
SessionFacade.LoggedInUser = user;
return true;
}
}
return false;
}
private static bool TryAuthenticateWithGkv(HttpApplication context)
{
if (context.Request.FilePath.IndexOf("GkvAbrechnungClient.aspx") == -1)
return false;
// Eigene IP
var clientip = GetIP(true);
// App 8 IP
var appsettingip = System.Configuration.ConfigurationManager.AppSettings["App8IpAddress"];
// Summen Server
var appsettingip2 = System.Configuration.ConfigurationManager.AppSettings["ServerSumIpAddress"];
if (appsettingip != clientip && appsettingip2 != clientip)
return false;
if(appsettingip == clientip)
if (!string.IsNullOrEmpty(lTenant))
{
var useroidstr = context.Request.Params["useroid"];
if (!long.TryParse(useroidstr, out long useroid))
return false;
SessionFacade.LoggedInUser = DAOFactory.GenericDAO.LoadByID<ApplicationUser>(useroid);
}
if (context.Request.Params.AllKeys.Contains("token"))
{
lUserName = GetLoginInfoFromToken(context.Request.Params["token"])["user"];
lPassword = GetLoginInfoFromToken(context.Request.Params["token"])["password"];
}
}
else
{
SessionFacade.LoggedInUser = DAOFactory.UserDAO.GetBSUser("BSAdmin", "xyz");
}
return true;
}
lUserName = context.Request.Params["username"];
lPassword = context.Request.Params["token"];
}
private static string GetIP(bool CheckForward = false)
{
// https://stackoverflow.com/a/13249280
if (!BS.Shared.Core.Utils.IsAnyNullOrEmpty(lUserName, lPassword))
{
var ip = context.Request.UserHostAddress;
string ip = null;
if (CheckForward)
{
ip = HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
}
var lUser = DAOFactory.UserDAO.FindUserByLoginName(lUserName, ip);
if (string.IsNullOrEmpty(ip))
{
ip = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
}
else
{ // Using X-Forwarded-For last address
ip = ip.Split(',')
.Last()
.Trim();
}
if (lUser != null && lUser.CheckRC2Password(lPassword))
{
SessionFacade.LoggedInUser = lUser;
return true;
}
}
return ip;
}
return false;
}
private static Dictionary<string, string> GetLoginInfoFromToken(string token)
{
if(string.IsNullOrWhiteSpace(token))
{
return new Dictionary<string, string>();
}
private static bool TryAuthenticateWithLoginForm(HttpApplication context)
{
var name = context.Request.Params["ctl00$tb_login"];
var password = context.Request.Params["ctl00$tb_password"];
string decodedToken;
if (!BS.Shared.Core.Utils.IsAnyNullOrEmpty(name, password))
{
ApplicationUser user = DAOFactory.UserDAO.FindUserByLoginName(name);
token = token.Replace(' ', '+');
token = token.Trim(',');
if (user != null && DAOFactory.UserDAO.CheckPassword(user, password))
{
SessionFacade.LoggedInUser = user;
return true;
}
}
try
{
decodedToken = DecryptString(HttpUtility.UrlDecode(token));
}
catch (Exception)
{
decodedToken = DecryptString(token);
}
return false;
}
if (decodedToken.Split(';')[2].Split('=')[0].Equals("myToken"))
{
var b = decodedToken.Split(';');
private static bool TryAuthenticateWithGkv(HttpApplication context)
{
if (context.Request.FilePath.IndexOf("GkvAbrechnungClient.aspx") == -1)
return false;
var a = DecryptString(new Regex(@"[\=]{1}").Split(b[2], 2)[1]);
decodedToken += ";" + a;
}
if (!IsRequestIPValid("App8IpAddress"))
return false;
var Params = decodedToken.Split(';');
var useroidstr = context.Request.Params["useroid"];
return Params.Select(item => item.Split('=')).Where(a => a[0].Equals("tenant") || a[0].Equals("password") || a[0].Equals("user")).ToDictionary(a => a[0], a => a[1]);
}
if (!long.TryParse(useroidstr, out long useroid))
return false;
private static string DecryptString(string strToDecrypt)
{
if(string.IsNullOrWhiteSpace(strToDecrypt))
{
return "Beim Decodieren ist leider ein Fehler aufgetreten.";
}
SessionFacade.LoggedInUser = DAOFactory.GenericDAO.LoadByID<ApplicationUser>(useroid);
strToDecrypt = strToDecrypt.Replace(' ', '+');
return true;
}
if(strToDecrypt.Contains(","))
{
strToDecrypt = strToDecrypt.Split(',')[0];
}
public static bool IsRequestIPValid(string appsetting)
{
var clientip = GetRequestIP(true);
var appsettingip = System.Configuration.ConfigurationManager.AppSettings[appsetting];
byte[] _Rc2IV = { 35, 138, 177, 253, 227, 63, 2, 27 };
byte[] _Rc2Key = { 174, 130, 219, 185, 185, 221, 96, 50, 37, 212, 81, 121, 71, 206, 130, 153 };
var lRc2CSP = new RC2CryptoServiceProvider();
var lDecryptor = lRc2CSP.CreateDecryptor(_Rc2Key, _Rc2IV);
#if DEBUG
if (clientip == "::1")
return true;
#endif
strToDecrypt = strToDecrypt.Replace(' ', '+');
strToDecrypt = strToDecrypt.Trim(',');
return clientip == appsettingip;
}
using (var msDecrypt = new MemoryStream(Convert.FromBase64String(strToDecrypt)))
{
using (var csDecrypt = new CryptoStream(msDecrypt, lDecryptor, CryptoStreamMode.Read))
{
var bytes = new List<byte>();
int b;
private static string GetRequestIP(bool CheckForward = false)
{
// https://stackoverflow.com/a/13249280
do
{
b = csDecrypt.ReadByte();
string ip = null;
if (CheckForward)
{
ip = HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
}
if(b != -1)
{
bytes.Add(Convert.ToByte(b));
}
if (string.IsNullOrEmpty(ip))
{
ip = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
}
else
{ // Using X-Forwarded-For last address
ip = ip.Split(',')
.Last()
.Trim();
}
} while (b != -1);
return ip;
}
return Encoding.UTF8.GetString(bytes.ToArray());
}
}
}
}
private static Dictionary<string, string> GetLoginInfoFromToken(string token)
{
if (string.IsNullOrWhiteSpace(token))
{
return new Dictionary<string, string>();
}
string decodedToken;
token = token.Replace(' ', '+');
token = token.Trim(',');
try
{
decodedToken = DecryptString(HttpUtility.UrlDecode(token));
}
catch (Exception)
{
decodedToken = DecryptString(token);
}
if (decodedToken.Split(';')[2].Split('=')[0].Equals("myToken"))
{
var b = decodedToken.Split(';');
var a = DecryptString(new Regex(@"[\=]{1}").Split(b[2], 2)[1]);
decodedToken += ";" + a;
}
var Params = decodedToken.Split(';');
return Params.Select(item => item.Split('=')).Where(a => a[0].Equals("tenant") || a[0].Equals("password") || a[0].Equals("user")).ToDictionary(a => a[0], a => a[1]);
}
private static string DecryptString(string strToDecrypt)
{
if (string.IsNullOrWhiteSpace(strToDecrypt))
{
return "Beim Decodieren ist leider ein Fehler aufgetreten.";
}
strToDecrypt = strToDecrypt.Replace(' ', '+');
if (strToDecrypt.Contains(","))
{
strToDecrypt = strToDecrypt.Split(',')[0];
}
byte[] _Rc2IV = { 35, 138, 177, 253, 227, 63, 2, 27 };
byte[] _Rc2Key = { 174, 130, 219, 185, 185, 221, 96, 50, 37, 212, 81, 121, 71, 206, 130, 153 };
var lRc2CSP = new RC2CryptoServiceProvider();
var lDecryptor = lRc2CSP.CreateDecryptor(_Rc2Key, _Rc2IV);
strToDecrypt = strToDecrypt.Replace(' ', '+');
strToDecrypt = strToDecrypt.Trim(',');
using (var msDecrypt = new MemoryStream(Convert.FromBase64String(strToDecrypt)))
{
using (var csDecrypt = new CryptoStream(msDecrypt, lDecryptor, CryptoStreamMode.Read))
{
var bytes = new List<byte>();
int b;
do
{
b = csDecrypt.ReadByte();
if (b != -1)
{
bytes.Add(Convert.ToByte(b));
}
} while (b != -1);
return Encoding.UTF8.GetString(bytes.ToArray());
}
}
}
}
}

View File

@@ -6,6 +6,8 @@
private static GenericDAO _GenericDAO;
private static ScriptDAO _ScriptDAO;
private static SearchDAO _SearchDAO;
private static UserDAO _UserDAO;
@@ -26,7 +28,15 @@
}
}
public static SearchDAO SearchDAO
public static ScriptDAO ScriptDAO
{
get
{
return _ScriptDAO ?? (_ScriptDAO = new ScriptDAO());
}
}
public static SearchDAO SearchDAO
{
get
{

45
Data/Access/ScriptDAO.cs Normal file
View File

@@ -0,0 +1,45 @@
using BS.Shared;
using DevExpress.XtraPrinting;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
namespace BeWo.Data.Access
{
public class ScriptDAO : AbstractBaseDAO
{
private string LoadSQLStatement(string statementName)
{
string sqlStatement = string.Empty;
string namespacePart = "BeWo.Data.Access.Scripts";
string resourceName = namespacePart + "." + statementName;
using (Stream stm = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName))
{
if (stm != null)
{
sqlStatement = new StreamReader(stm).ReadToEnd();
}
}
return sqlStatement;
}
public decimal? GetGkvSumByDateRange(DateTime? start, DateTime? end)
{
var sql = LoadSQLStatement("GetGkvSumByDateRange.sql");
var rtn = Session.CreateSQLQuery(sql)
.SetParameter(0, start ?? DateTime.MinValue)
.SetParameter(1, end ?? DateTime.MaxValue)
.UniqueResult<decimal>();
return rtn;
}
}
}

View File

@@ -0,0 +1,12 @@
SELECT SUM(a1.Betrag)
FROM gkvtransferprotokoll AS t1
JOIN gkvabrechnung a1
ON a1.Oid = t1.GkvAbrechnungOid
WHERE DATE(t1.ErstelltAm) >= ?
AND DATE(t1.ErstelltAm) <= ?
AND t1.Oid = (
SELECT MIN(Oid)
FROM gkvtransferprotokoll AS t2
WHERE t1.GkvAbrechnungOid = t2.GkvAbrechnungOid
GROUP BY t2.GkvAbrechnungOid
)

View File

@@ -27,6 +27,8 @@ using static System.String;
using Appointment = BeWo.Data.Entities.Appointment;
using Login = BeWo.Data.Entities.Login;
using Resource = BeWo.Data.Entities.Resource;
using System.Reflection;
using System.IO;
namespace BeWo.Data.Access
{
@@ -6207,5 +6209,28 @@ WHERE sc.Billable = 1 and sr.StartDate >= '{0:yyyy-MM-dd}' and sr.StartDate < '{
var q = Session.CreateSQLQuery(sql);
return q.List<long>().First();
}
public string GetGkvRawData(long oid, GkvRawDataType gkvRawData)
{
var criteria = CreateCriteria<GkvTransferProtokoll>()
.Add(Restrictions.Where<GkvTransferProtokoll>(x => x.Oid == oid));
if(gkvRawData == GkvRawDataType.Auftragsdatei)
{
criteria = criteria.SetProjection(Projections.Property(nameof(GkvTransferProtokoll.Auftragsdatei)));
}
else if(gkvRawData == GkvRawDataType.Nutzdatendatei)
{
criteria = criteria.SetProjection(Projections.Property(nameof(GkvTransferProtokoll.Nutzdatendatei)));
}
else
{
throw new ArgumentOutOfRangeException(nameof(gkvRawData), $"GkvRawDataType \'{gkvRawData}\' unbekannt.");
}
var t = criteria.List<string>().SingleOrDefault();
return t;
}
}
}

View File

@@ -46,6 +46,8 @@
<WarningLevel>4</WarningLevel>
<CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
<Prefer32Bit>false</Prefer32Bit>
<NoWarn>
</NoWarn>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
@@ -202,6 +204,7 @@
<Compile Include="Access\AdoDAO.cs" />
<Compile Include="Access\DAOFactory.cs" />
<Compile Include="Access\GenericDAO.cs" />
<Compile Include="Access\ScriptDAO.cs" />
<Compile Include="Access\SearchDAO.cs" />
<Compile Include="Access\UserDAO.cs" />
<Compile Include="ASPHibernateSessionManager.cs" />
@@ -699,6 +702,7 @@
</BootstrapperPackage>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="Access\Scripts\GetGkvSumByDateRange.sql" />
<Content Include="ICD10\icd10.xml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>

1
Host/AdminService.svc Normal file
View File

@@ -0,0 +1 @@
<%@ ServiceHost Language="C#" Debug="true" Service="BeWo.Service.ServiceImplementations.AdminServiceImp" %>

View File

@@ -1,4 +1,5 @@
using BeWo.Data.Access;
using BeWo.Data;
using BeWo.Data.Access;
using BeWo.Data.Entities;
using BeWo.Service.ServiceImplementations;
using BS.Shared;
@@ -7,6 +8,7 @@ using BS.Shared.DataContracts;
using BS.Shared.DataContracts.GkvAbrechnung;
using BS.Shared.Exceptions;
using Newtonsoft.Json;
using NHibernate.Dialect.Function;
using System;
using System.Collections.Generic;
using System.Configuration;
@@ -19,6 +21,13 @@ using System.Web.UI.WebControls;
namespace Host
{
/// <summary>
///
/// Stellt einen Entpunkt für Clients dar.
/// z.B. app2,app3,app4,...
///
///
/// </summary>
public partial class GkvAbrechnungClient : Page
{
private readonly string INVALID_INPUT = "Bad Request";
@@ -74,15 +83,18 @@ namespace Host
private void ClientResult(GkvClientResultRequestDC req)
{
if (!SessionFacade.IsUserLoggedIn())
SendErrorResponse(INVALID_INPUT + " 4");
if (req.ResultDCs is null || !req.ResultDCs.Any())
SendInvalidInputResponse();
SendErrorResponse(INVALID_INPUT + " 5");
// Response
var response = new GkvResponseDC(false);
try
{
var service = new AccountingServiceImp();
var service = new GkvAccountingServiceImp();
service.HandleGkvServerResults(req.ResultDCs);
@@ -102,30 +114,29 @@ namespace Host
private void ClientSum(GkvClientSumRequestJson req)
{
if (req.Tenant is null)
SendInvalidInputResponse();
if (req.Start > req.End)
SendInvalidInputResponse();
SendErrorResponse(INVALID_INPUT + " 4");
if (!ASPHibernateSessionManager.IsRequestIPValid("GkvSumServerIPAdress"))
SendErrorResponse(INVALID_INPUT + " 5");
// Response
var response = new GkvClientSumResponseJson();
try
{
var service = new AccountingServiceImp();
var sum = DAOFactory.ScriptDAO.GetGkvSumByDateRange(req.Start, req.End);
var invoices = service.GetCompactGkvAbrechnungByTransferDateRange(req.Start, req.End);
if(invoices is object && invoices.Count > 0)
if(sum is decimal s)
{
response.CompactGkvAbrechnungen = invoices.ToArray();
response.Success = true;
response.Sum = s;
}
else
{
response.Message = "no records";
response.Message = "sum is null";
}
response.Success = true;
}
catch (GkvException e)
{

View File

@@ -18,6 +18,13 @@ using Page = System.Web.UI.Page;
namespace Host
{
/// <summary>
///
/// Stellt einen Entpunkt für Server dar.
/// Hier: app8
///
///
/// </summary>
public partial class GkvAbrechnungServer : Page
{
public const int PROCESS_WAITFOREXIT_MS = 10 * 1000;

View File

@@ -0,0 +1 @@
<%@ ServiceHost Language="C#" Debug="true" Service="BeWo.Service.ServiceImplementations.GkvAccountingServiceImp" %>

View File

@@ -168,6 +168,8 @@
</Reference>
</ItemGroup>
<ItemGroup>
<Content Include="AdminService.svc" />
<Content Include="GkvAccountingService.svc" />
<Content Include="Admin.aspx" />
<Content Include="AnalysisService.svc" />
<Content Include="Content\BeWoMobilTheme.min.css" />

View File

@@ -113,25 +113,16 @@
<requestLimits maxQueryString="65536" maxUrl="65536" />
</requestFiltering>
</security>
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" />
<add name="Access-Control-Allow-Headers" value="Content-Type" />
</customHeaders>
</httpProtocol>
</system.webServer>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="TransportSecurity" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647">
<security mode="None">
<transport clientCredentialType="None" />
</security>
<readerQuotas maxStringContentLength="2147483647" />
</binding>
<binding name="TransportSecurityStreaming" maxBufferSize="65536" maxReceivedMessageSize="2147483647" messageEncoding="Text" transferMode="StreamedRequest">
<security mode="None">
<transport clientCredentialType="None" />
</security>
<readerQuotas maxStringContentLength="2147483647" maxArrayLength="2147483647" />
</binding>
</basicHttpBinding>
</bindings>
<system.serviceModel>
<services>
<service behaviorConfiguration="returnFaults" name="BeWo.Service.ServiceImplementations.EmployeeServiceImp">
<endpoint behaviorConfiguration="SecurityAndSessionBehavior" binding="basicHttpBinding" bindingConfiguration="TransportSecurity" name="EmployeeServiceEndpoint" contract="BeWo.Service.ServiceContracts.IEmployeeService" />
@@ -169,6 +160,9 @@
<service behaviorConfiguration="returnFaults" name="BeWo.Service.ServiceImplementations.AccountingServiceImp">
<endpoint behaviorConfiguration="SecurityAndSessionBehavior" binding="basicHttpBinding" bindingConfiguration="TransportSecurity" name="AccountingServiceEndpoint" contract="BeWo.Service.ServiceContracts.IAccountingService" />
</service>
<service behaviorConfiguration="returnFaults" name="BeWo.Service.ServiceImplementations.GkvAccountingServiceImp">
<endpoint behaviorConfiguration="SecurityAndSessionBehavior" binding="basicHttpBinding" bindingConfiguration="TransportSecurity" name="GkvAccountingServiceEndpoint" contract="BeWo.Service.ServiceContracts.IGkvAccountingService" />
</service>
<service behaviorConfiguration="returnFaults" name="BeWo.Service.ServiceImplementations.MailServiceImp">
<endpoint behaviorConfiguration="SecurityAndSessionBehavior" binding="basicHttpBinding" bindingConfiguration="TransportSecurity" name="MailServiceEndpoint" contract="BeWo.Service.ServiceContracts.IMailService" />
</service>
@@ -181,7 +175,34 @@
<service behaviorConfiguration="returnFaults" name="BeWo.Service.ServiceImplementations.EnumTranslationServiceImp">
<endpoint behaviorConfiguration="SecurityAndSessionBehavior" binding="basicHttpBinding" bindingConfiguration="TransportSecurity" name="EnumTranslationServiceEndpoint" contract="BeWo.Service.ServiceContracts.IEnumTranslationService" />
</service>
<service behaviorConfiguration="returnFaults" name="BeWo.Service.ServiceImplementations.AdminServiceImp">
<endpoint behaviorConfiguration="webHttpBehaviorConfig" binding="webHttpBinding" bindingConfiguration="webHttpBindingConfig" name="AdminServiceEndpoint" contract="BeWo.Service.ServiceContracts.IAdminService" />
</service>
</services>
<bindings>
<basicHttpBinding>
<binding name="TransportSecurity" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647">
<security mode="None">
<transport clientCredentialType="None" />
</security>
<readerQuotas maxStringContentLength="2147483647" />
</binding>
<binding name="TransportSecurityStreaming" maxBufferSize="65536" maxReceivedMessageSize="2147483647" messageEncoding="Text" transferMode="StreamedRequest">
<security mode="None">
<transport clientCredentialType="None" />
</security>
<readerQuotas maxStringContentLength="2147483647" maxArrayLength="2147483647" />
</binding>
</basicHttpBinding>
<webHttpBinding>
<binding name="webHttpBindingConfig">
<!-- Optional: Maximale Nachrichten- und Puffergröße anpassen -->
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<security mode="None" />
<!-- Für ungesicherte Verbindungen (HTTP) -->
</binding>
</webHttpBinding>
</bindings>
<behaviors>
<endpointBehaviors>
<behavior name="SecurityBehavior">
@@ -189,11 +210,19 @@
<SecurityExtension />
</behavior>
<behavior name="SecurityAndSessionBehavior">
<!--wichtig: erst Mulittenancy dann session dann security!-->
<!--wichtig: Mulittenancy >>> Hibernate >>> Security(Permission)!-->
<MultitenancyExtension />
<HibernateSessionExtension />
<SecurityExtension />
</behavior>
<behavior name="webHttpBehaviorConfig">
<!--wichtig: Security(ip) >>> Multitenancy >>> Hibernate >>> JsonErrorExtension-->
<AdminSecurityExtension />
<AdminMultitenancyExtension />
<AdminHibernateSessionExtension />
<webHttp />
<JsonErrorExtension/>
</behavior>
</endpointBehaviors>
<serviceBehaviors>
<behavior name="returnFaults">
@@ -209,11 +238,20 @@
<add name="MultitenancyExtension" type="BeWo.Service.Multitenancy.MultitenancyBehaviorExtension, BeWo.Service, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null" />
<add name="SecurityExtension" type="BeWo.Service.Security.SecurityBehaviorExtension, BeWo.Service, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null" />
<add name="HibernateSessionExtension" type="BeWo.Service.UnitOfWork.HibernateSessionBehaviorExtension, BeWo.Service, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null" />
<add name="AdminMultitenancyExtension" type="BeWo.Service.ServiceBehavior.AdminMultitenancyBehaviorExtension, BeWo.Service, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null" />
<add name="AdminSecurityExtension" type="BeWo.Service.ServiceBehavior.AdminSecurityBehaviorExtension, BeWo.Service, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null" />
<add name="AdminHibernateSessionExtension" type="BeWo.Service.ServiceBehavior.AdminHibernateBehaviorExtension, BeWo.Service, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null" />
<add name="JsonErrorExtension" type="BeWo.Service.ServiceBehavior.JsonError.JsonErrorBehaviorExtension, BeWo.Service, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null" />
</behaviorExtensions>
</extensions>
</system.serviceModel>
<!-- <> <> <> Appsettings <> <> <> -->
<appSettings>
<add key="AdminServiceIPAddress" value="::1" />
<add key="AdminServiceIPAddress2" value="::1" />
<add key="AdminServiceAPIKey" value="HasteGedachteWa" />
<add key="AdminServiceEnableStackTrace" value="true" />
<add key="SendMailOnError" value="false" />
<add key="SmptServer" value="mail.ownsoft.de" />
<add key="SmtpUser" value="bewoplaner.support@ownsoft.de" />
@@ -245,7 +283,7 @@
<add key="DakotaPath" value="C:\Program Files (x86)\ITSG\dakotale\dakota30.exe" />
<add key="GkvSecretKey" value="DfDGNGn72PKfSYxSUsmRdzuBtpR9novewlmYU3gsjiFgSkaZZeylUXlbO42cWNqiKgLdMUFtWUNZT962F1raQDR7HGUzCNYsFeC" />
<add key="App8IpAddress" value="88.198.50.220" />
<add key="ServerSumIpAddress" value="88.198.50.220" />
<add key="GkvSumServerIPAdress" value="88.198.50.220" />
<add key="SendMailModuleSmtpServer" value="mail.ownsoft.de" />
<add key="SendMailModuleGkvEnabled" value="true" />

View File

@@ -13,7 +13,29 @@ namespace BeWo.Service.DCEntityMapper
{
public class GkvAbrechnungDC_GkvAbrechnung : AbstractIDCEntityMapper<GkvAbrechnung, GkvAbrechnungDC>
{
public override GkvAbrechnungDC MergeWithDC(GkvAbrechnung pEntity, GkvAbrechnungDC pDataContract)
public void ClearRawData(List<GkvAbrechnungDC> gkvAbrechnungen)
{
if ((!gkvAbrechnungen?.Any()) ?? true)
return;
foreach (var gkvAbrechnung in gkvAbrechnungen)
{
ClearRawData(gkvAbrechnung);
}
}
public void ClearRawData(GkvAbrechnungDC gkvAbrechnung)
{
if ((!gkvAbrechnung.TransferProtokolle?.Any()) ?? true)
return;
foreach (var protokoll in gkvAbrechnung.TransferProtokolle)
{
MapperFactory.GkvTransferProtokollDC_GkvTransferprotokoll.ClearRawData(protokoll);
}
}
public override GkvAbrechnungDC MergeWithDC(GkvAbrechnung pEntity, GkvAbrechnungDC pDataContract)
{
if(pEntity.InvoiceBases == null || !pEntity.InvoiceBases.Any())
{

View File

@@ -4,6 +4,7 @@ using BeWo.Data.Entities;
using BS.Shared.DataContracts;
using BS.Shared.DataContracts.GkvAbrechnung;
using NHibernate.Linq;
using System;
using System.Collections.Generic;
using System.Linq;
@@ -11,7 +12,13 @@ namespace BeWo.Service.DCEntityMapper
{
public class GkvTransferProtokollDC_GkvTransferprotokoll : AbstractIDCEntityMapper<GkvTransferProtokoll, GkvTransferProtokollDC>
{
public override GkvTransferProtokollDC MergeWithDC(GkvTransferProtokoll pEntity, GkvTransferProtokollDC pDataContract)
public void ClearRawData(GkvTransferProtokollDC gkvTransfer)
{
gkvTransfer.Auftragsdatei = null;
gkvTransfer.Nutzdatendatei = null;
}
public override GkvTransferProtokollDC MergeWithDC(GkvTransferProtokoll pEntity, GkvTransferProtokollDC pDataContract)
{
pDataContract.IKDatenannahmestelle = pEntity.IKDatenannahmestelle;
pDataContract.IKKrankenkasse = pEntity.IKKrankenkasse;
@@ -49,7 +56,7 @@ namespace BeWo.Service.DCEntityMapper
return pDataContract;
}
public override GkvTransferProtokoll MergeWithEntity(GkvTransferProtokollDC pDataContract, GkvTransferProtokoll pEntity)
public override GkvTransferProtokoll MergeWithEntity(GkvTransferProtokollDC pDataContract, GkvTransferProtokoll pEntity)
{
this.ConcurrencyCheck(pDataContract.GkvTransferProtokollVersion, pEntity);

View File

@@ -1,46 +0,0 @@
using System;
using System.Collections.Generic;
using System.Configuration;
using System.IO;
using System.Linq;
using System.Net;
using System.Security.Cryptography;
using System.Text;
using System.Text.RegularExpressions;
using System.Web;
using System.Windows;
using BeWo.Data;
using BeWo.Data.Access;
using BeWo.Data.Entities;
using BS.Shared;
using BS.Shared.DataContracts;
namespace BeWo.Service.Security
{
public class Method2Rights
{
public static Dictionary<String, IList<UserRightType>> GetAuthorizedMethodDictionary()
{
var dict = new Dictionary<String, IList<UserRightType>>();
dict.Add("DeleteUserGroups", new UserRightType[] { UserRightType.UserGroupView_Delete });
dict.Add("DeactivateUserGroup", new UserRightType[] { UserRightType.UserGroupView_Delete });
dict.Add("UpdateUserGroup", new UserRightType[] { UserRightType.UserGroupView_Edit, UserRightType.EditAll });
dict.Add("InsertNewUserGroup", new UserRightType[] { UserRightType.UserGroupView_Create });
dict.Add("InsertNewUser", new UserRightType[] { UserRightType.UserView_Create });
dict.Add("DeactivateUser", new UserRightType[] { UserRightType.UserView_Delete });
dict.Add("DeactivateUsers", new UserRightType[] { UserRightType.UserView_Delete });
dict.Add("DeleteUsers", new UserRightType[] { UserRightType.UserView_Delete });
dict.Add("DeleteUser", new UserRightType[] { UserRightType.UserView_Delete });
dict.Add("UpdateUser", new UserRightType[] { UserRightType.UserView_Edit });
return dict;
}
}
}

View File

@@ -1,6 +1,7 @@
using System;
using System.Linq;
using System.Net;
using System.Reflection;
using System.Security;
using System.ServiceModel;
using System.ServiceModel.Channels;
@@ -11,147 +12,157 @@ using BeWo.Data;
using BeWo.Data.Access;
using BeWo.Data.Entities;
using BeWo.Service.Core;
using BeWo.Service.ServiceContracts;
using BeWo.Service.ServiceUtils;
using BS.Shared.Attributes;
using BS.Shared.Extensions;
using NHibernate.Hql.Ast.ANTLR.Tree;
namespace BeWo.Service.Security
{
public class SecurityContextInitializer : ICallContextInitializer
{
public void AfterInvoke(object pCorrelationState)
{
if (pCorrelationState is LoggedInUserOperationContextExt)
{
OperationContext.Current.Extensions.Remove((LoggedInUserOperationContextExt)pCorrelationState);
}
}
public class SecurityContextInitializer : ICallContextInitializer
{
private readonly string[] ALLOW_ALWAYS = new string[]
{
//"Download",
//"Download2",
//"DownloadInfo",
//"GetUpdatePlan",
//"GetUpdateFile",
"ResetAllTenants",
"IsUserValid",
"IsUserValidTwoFactor",
"ResetTenant",
"GetEmailForUserName",
"GetTranslationDictionary",
};
public object BeforeInvoke(InstanceContext pInstanceContext, IClientChannel pChannel, Message pMessage)
{
try
{
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
private readonly string[] ALLOW_ONLY_WITH_LOGIN = new string[] {
"LoadUserByNameAndPassword",
"LoadUserByLoginName",
"GetMandator",
"LoadEmployee",
"GetPersonsHavingBirthday",
"GetLastLogins",
"GetSupportConceptsWithConferenceDate",
"GetExpiringSupportConcepts",
"GetPublishedNewsItemsForEmployee",
"GetAllActiveEmployeesCompact",
"GetHomeViewPanels",
"LoadCompactEmployee",
"GetTranslationDictionary",
"ConvertToNewSubstitutionType" };
var lTemp = pMessage.Headers.Action.Split("/");
string lMethodName = lTemp[lTemp.Count - 1];
string lServiceInterface = lTemp[lTemp.Count - 2];
public void AfterInvoke(object pCorrelationState)
{
if (pCorrelationState is LoggedInUserOperationContextExt)
{
OperationContext.Current.Extensions.Remove((LoggedInUserOperationContextExt)pCorrelationState);
}
}
// TODO Hier kann man jetzt etwas bauen wer sich für welchen service autorisieren muss...
var skip = new string[] { "Download", "Download2", "DownloadInfo", "GetUpdatePlan", "GetUpdateFile", "ResetAllTenants" };
if (lMethodName == "IsUserValid" || lMethodName == "IsUserValidTwoFactor" || lMethodName == "ResetTenant" || lMethodName == "ResetAllTenant" || lMethodName == "GetEmailForUserName" || lMethodName == "GetTranslationDictionary")
{
return null;
}
else if (skip.Contains(lMethodName))
{
return null;
}
else
{
// Vergessen neue Methode einzutragen?
}
public object BeforeInvoke(InstanceContext pInstanceContext, IClientChannel pChannel, Message pMessage)
{
try
{
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
string lUserName = null, lPassword = null;
var lTemp = pMessage.Headers.Action.Split("/");
string lMethodName = lTemp[lTemp.Count - 1];
string lServiceInterface = lTemp[lTemp.Count - 2];
int lSecurityHeaderIndex = pMessage.Headers.FindHeader("Security", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd");
// TODO Hier kann man jetzt etwas bauen wer sich für welchen service autorisieren muss...
if (ALLOW_ALWAYS.Contains(lMethodName))
{
return null;
}
else
{
// Vergessen neue Methode einzutragen?
}
if (lSecurityHeaderIndex > -1)
{
XmlReader lReader = pMessage.Headers.GetReaderAtHeader(lSecurityHeaderIndex);
string lUserName = null, lPassword = null;
if (lReader.ReadToFollowing("Username"))
{
lUserName = lReader.ReadString();
}
int lSecurityHeaderIndex = pMessage.Headers.FindHeader("Security", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd");
if (lReader.ReadToFollowing("Password"))
{
lPassword = lReader.ReadString();
}
if (lSecurityHeaderIndex > -1)
{
XmlReader lReader = pMessage.Headers.GetReaderAtHeader(lSecurityHeaderIndex);
ApplicationUser lUser = DAOFactory.UserDAO.FindUserByLoginName(lUserName);
if (lReader.ReadToFollowing("Username"))
{
lUserName = lReader.ReadString();
}
if (lUser != null && DAOFactory.UserDAO.CheckPassword(lUser, lPassword))
{
if (!HasMethodAuthorization(lUser, lMethodName))
{
throw new SecurityException("Methode nicht autorisiert: " + lMethodName);
}
if (lReader.ReadToFollowing("Password"))
{
lPassword = lReader.ReadString();
}
var lExt = new LoggedInUserOperationContextExt { User = lUser, LoginName = lUserName, UnhashedPassword = lPassword };
OperationContext.Current.Extensions.Add(lExt);
return lExt;
}
}
ApplicationUser lUser = DAOFactory.UserDAO.FindUserByLoginName(lUserName);
throw new SecurityException("Nicht autorisiert");
}
catch (Exception e)
{
throw Utils.CreateBeWoFaultException(e);
}
}
if (lUser != null && DAOFactory.UserDAO.CheckPassword(lUser, lPassword))
{
if (!HasMethodAuthorization(lUser, lMethodName, pMessage))
{
throw new SecurityException("Methode nicht autorisiert: " + lMethodName);
}
private bool HasMethodAuthorization(ApplicationUser lUser, string methodName)
{
var alwaysAllowed = new string[]
{
"LoadUserByNameAndPassword", "LoadUserByLoginName", "GetMandator", "LoadEmployee",
"GetPersonsHavingBirthday",
"GetLastLogins",
"GetSupportConceptsWithConferenceDate",
"GetExpiringSupportConcepts",
"GetPublishedNewsItemsForEmployee",
"GetAllActiveEmployeesCompact",
"GetHomeViewPanels",
"LoadCompactEmployee",
"GetTranslationDictionary",
"ConvertToNewSubstitutionType"
};
var lExt = new LoggedInUserOperationContextExt { User = lUser, LoginName = lUserName, UnhashedPassword = lPassword };
OperationContext.Current.Extensions.Add(lExt);
return lExt;
}
}
if (alwaysAllowed.Contains(methodName))
{
return true;
}
throw new SecurityException("Nicht autorisiert");
}
catch (Exception e)
{
throw Utils.CreateBeWoFaultException(e);
}
}
var rights = Utils.GetGrantedRights(lUser);
var dict = Method2Rights.GetAuthorizedMethodDictionary();
private bool HasMethodAuthorization(ApplicationUser pUser, string methodName, Message pMessage)
{
if (ALLOW_ONLY_WITH_LOGIN.Contains(methodName))
{
return true;
}
else
{
// Vergessen neue Methode einzutragen?
}
if (dict.ContainsKey(methodName))
{
bool allowed = false;
var minimumRechte = dict[methodName];
var rights = Utils.GetGrantedRights(pUser);
foreach (var right in minimumRechte)
{
if (rights.Contains(right))
{
allowed = true;
}
}
// Finde Action
var lTemp = pMessage.Headers.Action?.Split("/");
return allowed;
}
//var dict = Right2Methods.GetAuthorizedMethodDictionary();
if (lTemp is null)
lTemp = pMessage.Headers.To.Segments.ToList();
//foreach (var right in rights)
//{
if (lTemp is null)
throw new ArgumentException("Kann Action nicht finden");
// if (dict.ContainsKey(right))
// {
// var names = dict[right];
// if (names.Contains(methodName))
// {
// return true;
// }
// Extrahiere MethodeName + ServiceInterface
string lMethodName = lTemp[lTemp.Count - 1].Trim('/');
string lServiceInterface = lTemp[lTemp.Count - 2].Trim('/');
// return true;
// }
//}
try
{
var attribute = ServiceHelper.GetCustomAttribute<RequirePermissionAttribute>(lServiceInterface, lMethodName);
if (attribute != null)
{
return attribute.HasPermission(rights);
}
}
catch (Exception e)
{
return true;
}
}
}
return true;
}
}
}

View File

@@ -191,6 +191,7 @@
<Reference Include="System.ServiceModel">
<RequiredTargetFramework>3.0</RequiredTargetFramework>
</Reference>
<Reference Include="System.ServiceModel.Web" />
<Reference Include="System.Text.Encoding.CodePages, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Text.Encoding.CodePages.5.0.0\lib\net461\System.Text.Encoding.CodePages.dll</HintPath>
</Reference>
@@ -472,16 +473,29 @@
<Compile Include="Reporting\AnnualReportFactory.cs" />
<Compile Include="SBD\VertretungsAlgorithmus.cs" />
<Compile Include="SBD\VertretungsManager.cs" />
<Compile Include="Security\Method2Rights.cs" />
<Compile Include="Security\SecurityBehaviorExtension.cs" />
<Compile Include="Security\SecurityEndpointBehavior.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Security\SecurityContextInitializer.cs" />
<Compile Include="Security\Right2Methods.cs" />
<Compile Include="Security\SecurityUtils.cs" />
<Compile Include="ServiceBehavior\AdminHibernateBehavior.cs" />
<Compile Include="ServiceBehavior\AdminHibernateBehaviorExtension.cs" />
<Compile Include="ServiceBehavior\AdminHibernateContextInitializer.cs" />
<Compile Include="ServiceBehavior\AdminMultitenancyBehavior.cs" />
<Compile Include="ServiceBehavior\AdminMultitenancyBehaviorExtension.cs" />
<Compile Include="ServiceBehavior\AdminMultitenancyContextInitializer.cs" />
<Compile Include="ServiceBehavior\AdminSecurityBehavior.cs" />
<Compile Include="ServiceBehavior\AdminSecurityBehaviorExtension.cs" />
<Compile Include="ServiceBehavior\AdminServiceMessageInspector.cs" />
<Compile Include="ServiceBehavior\JsonError\JsonErrorBehavior.cs" />
<Compile Include="ServiceBehavior\JsonError\JsonErrorBehaviorExtension.cs" />
<Compile Include="ServiceBehavior\JsonError\JsonErrorHandler.cs" />
<Compile Include="ServiceContracts\BeWoFault.cs" />
<Compile Include="ServiceContracts\IAccountingService.cs" />
<Compile Include="ServiceContracts\IAdminService.cs" />
<Compile Include="ServiceContracts\IAnalysisService.cs" />
<Compile Include="ServiceContracts\IGkvAccountingService.cs" />
<Compile Include="ServiceContracts\IMailService.cs" />
<Compile Include="ServiceContracts\IOperationsService.cs" />
<Compile Include="ServiceContracts\IDownloadService.cs" />
@@ -492,7 +506,9 @@
<Compile Include="ServiceContracts\IStreamingService.cs" />
<Compile Include="ServiceContracts\IResourceService.cs" />
<Compile Include="ServiceImplementations\AccountingServiceImp.cs" />
<Compile Include="ServiceImplementations\AdminServiceImp.cs" />
<Compile Include="ServiceImplementations\AnalysisServiceImp.cs" />
<Compile Include="ServiceImplementations\GkvAccountingServiceImp.cs" />
<Compile Include="ServiceImplementations\MailServiceImp.cs" />
<Compile Include="ServiceImplementations\OperationsServiceImp.cs" />
<Compile Include="ServiceImplementations\QueryServiceImp.cs" />
@@ -513,6 +529,8 @@
<Compile Include="ServiceUtils\DistanceCalculator\IDistanceAPI.cs" />
<Compile Include="ServiceUtils\DistanceCalculator\OpenrouteServiceAPI.cs" />
<Compile Include="ServiceUtils\ServiceTranslator.cs" />
<Compile Include="ServiceUtils\ServiceHelper.cs" />
<Compile Include="ServiceUtils\UriTemplateResolver.cs" />
<Compile Include="UnitOfWork\HibernateSessionEndpointBehavior.cs" />
<Compile Include="UnitOfWork\HibernateSessionBehaviorExtension.cs" />
<Compile Include="UnitOfWork\HibernateSessionContextInitializer.cs" />

View File

@@ -0,0 +1,35 @@
using BeWo.Service.UnitOfWork;
using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel.Channels;
using System.ServiceModel.Description;
using System.ServiceModel.Dispatcher;
using System.Text;
using System.Threading.Tasks;
namespace BeWo.Service.ServiceBehavior
{
public class AdminHibernateBehavior : IEndpointBehavior
{
public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
{
}
public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)
{
}
public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)
{
foreach (DispatchOperation iOperation in endpointDispatcher.DispatchRuntime.Operations)
{
iOperation.CallContextInitializers.Add(new AdminHibernateContextInitializer());
}
}
public void Validate(ServiceEndpoint endpoint)
{
}
}
}

View File

@@ -0,0 +1,20 @@
using BeWo.Service.UnitOfWork;
using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel.Configuration;
using System.Text;
using System.Threading.Tasks;
namespace BeWo.Service.ServiceBehavior
{
public class AdminHibernateBehaviorExtension : BehaviorExtensionElement
{
public override Type BehaviorType => typeof(AdminHibernateBehavior);
protected override object CreateBehavior()
{
return new AdminHibernateBehavior();
}
}
}

View File

@@ -0,0 +1,49 @@
using BeWo.Data;
using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel;
using System.ServiceModel.Channels;
using System.ServiceModel.Dispatcher;
using System.Text;
using System.Threading.Tasks;
namespace BeWo.Service.ServiceBehavior
{
public class AdminHibernateContextInitializer : ICallContextInitializer
{
public void AfterInvoke(object pCorrelationState)
{
if (pCorrelationState != null)
{
WCFHibernateSessionManager.CloseSession();
OperationContext.Current.Extensions.Remove((SessionOperationContextExt)pCorrelationState);
}
}
public object BeforeInvoke(InstanceContext pInstanceContext, IClientChannel pChannel, Message pMessage)
{
if (MultitenancyOperationContextExt.Current?.Tenant is null)
return null;
try
{
//System.Threading.Monitor.Enter
SessionOperationContextExt lExt = new SessionOperationContextExt();
//int c = OperationContext.Current.Extensions.Count;
//if (c > 0)
//{
// int te st = 0;
//}
OperationContext.Current.Extensions.Add(lExt);
WCFHibernateSessionManager.OpenSession();
return lExt;
}
catch (Exception e)
{
throw new FaultException(e.ToString());
return null;
}
}
}
}

View File

@@ -0,0 +1,36 @@
using BeWo.Service.Multitenancy;
using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel.Channels;
using System.ServiceModel.Description;
using System.ServiceModel.Dispatcher;
using System.Text;
using System.Threading.Tasks;
namespace BeWo.Service.ServiceBehavior
{
public class AdminMultitenancyBehavior : IEndpointBehavior
{
public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
{
}
public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)
{
throw new NotImplementedException("This is a server behavior only");
}
public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)
{
foreach (DispatchOperation iOperation in endpointDispatcher.DispatchRuntime.Operations)
{
iOperation.CallContextInitializers.Add(new AdminMultitenancyContextInitializer());
}
}
public void Validate(ServiceEndpoint endpoint)
{
}
}
}

View File

@@ -0,0 +1,19 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel.Configuration;
using System.Text;
using System.Threading.Tasks;
namespace BeWo.Service.ServiceBehavior
{
public class AdminMultitenancyBehaviorExtension : BehaviorExtensionElement
{
public override Type BehaviorType => typeof(AdminMultitenancyBehavior);
protected override object CreateBehavior()
{
return new AdminMultitenancyBehavior();
}
}
}

View File

@@ -0,0 +1,97 @@
using BeWo.Data;
using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel.Channels;
using System.ServiceModel;
using System.Text;
using System.Threading.Tasks;
using System.Web;
using System.Xml;
using System.ServiceModel.Dispatcher;
using BeWo.Service.Core;
using BS.Shared.Extensions;
using BeWo.Service.ServiceUtils;
using BS.Shared.Attributes;
using static System.Windows.Forms.VisualStyles.VisualStyleElement.StartPanel;
namespace BeWo.Service.ServiceBehavior
{
public class AdminMultitenancyContextInitializer : ICallContextInitializer
{
public void AfterInvoke(object pCorrelationState)
{
if (pCorrelationState is MultitenancyOperationContextExt)
{
OperationContext.Current.Extensions.Remove((MultitenancyOperationContextExt)pCorrelationState);
}
}
public object BeforeInvoke(InstanceContext pInstanceContext, IClientChannel pChannel, Message pMessage)
{
string lTenant = null;
// Hole Interface
string lInterface = null;
var segments = pChannel.LocalAddress.Uri.Segments;
for (int i = 0; i < segments.Length; i++)
{
var seg = segments[i].Trim('/');
if (seg.EndsWith(".svc"))
{
lInterface = "I" + seg.Substring(0, seg.Length - 4);
}
}
if (string.IsNullOrWhiteSpace(lInterface))
{
throw new ArgumentException($"Zugriff verweigert. Interface unbekannt");
}
// Hole Methode
string lMethod = pMessage.Properties[WebHttpDispatchOperationSelector.HttpOperationNamePropertyName] as string;
if (string.IsNullOrWhiteSpace(lMethod))
{
throw new ArgumentException($"Zugriff verweigert. Methode unbekannt");
}
// RequireNoTenant
var lTemp = ServiceHelper.GetCustomAttribute<RequireNoTenantAttribute>(lInterface, lMethod);
if (lTemp is object)
{
return null;
}
// Hole tenant aus Query
// Wird erstmal nicht benötigt. Per Header besser
// Ungefähr auf einem Level wie Username
//if (pMessage.Properties?.Via is Uri uri)
//{
// var query = HttpUtility.ParseQueryString(uri.Query);
// var tenant = query["tenant"];
// lTenant = tenant;
//}
// Hole tenant aus Header
if (string.IsNullOrWhiteSpace(lTenant))
{
var prop = (HttpRequestMessageProperty)pMessage.Properties[HttpRequestMessageProperty.Name];
lTenant = prop?.Headers["tenant"];
}
// Wenn kein Tenant gefunden wird,
if (string.IsNullOrWhiteSpace(lTenant))
{
throw new ArgumentException($"Zugriff verweigert. Tenant (\'{lTenant}\') darf nicht leer sein.", nameof(lTenant));
}
var lExt = new MultitenancyOperationContextExt { Tenant = lTenant };
OperationContext.Current.Extensions.Add(lExt);
return lExt;
}
}
}

View File

@@ -0,0 +1,39 @@
using BeWo.Data;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Configuration;
using System.Linq;
using System.ServiceModel;
using System.ServiceModel.Channels;
using System.ServiceModel.Description;
using System.ServiceModel.Dispatcher;
using System.Text;
using System.Threading.Tasks;
namespace BeWo.Service.ServiceBehavior
{
public class AdminSecurityBehavior : IEndpointBehavior
{
public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
{
// Keine zusätzlichen Bindungsparameter erforderlich
}
public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)
{
// Verhalten für Clients - hier nicht benötigt
}
public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)
{
// Füge einen Message Inspector hinzu, um eingehende Requests zu überprüfen
endpointDispatcher.DispatchRuntime.MessageInspectors.Add(new AdminServiceMessageInspector());
}
public void Validate(ServiceEndpoint endpoint)
{
// Optional: Endpunktvalidierung (falls erforderlich)
}
}
}

View File

@@ -0,0 +1,15 @@
using System;
using System.ServiceModel.Configuration;
namespace BeWo.Service.ServiceBehavior
{
public class AdminSecurityBehaviorExtension : BehaviorExtensionElement
{
public override Type BehaviorType => typeof(AdminSecurityBehavior);
protected override object CreateBehavior()
{
return new AdminSecurityBehavior();
}
}
}

View File

@@ -0,0 +1,57 @@
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.ServiceModel.Channels;
using System.ServiceModel.Dispatcher;
using System.ServiceModel;
using System.Text;
using System.Threading.Tasks;
using BeWo.Data;
namespace BeWo.Service.ServiceBehavior
{
public class AdminServiceMessageInspector : IDispatchMessageInspector
{
public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
{
// Hole die erlaubte IP aus den appSettings
string allowedIP = ConfigurationManager.AppSettings["AdminServiceIPAddress"];
string allowedIP2 = ConfigurationManager.AppSettings["AdminServiceIPAddress2"];
// Extrahiere die RemoteEndpoint-IP-Adresse
string remoteIP = request.Properties.ContainsKey(RemoteEndpointMessageProperty.Name)
? ((RemoteEndpointMessageProperty)request.Properties[RemoteEndpointMessageProperty.Name]).Address
: null;
var allowed = string.Equals(remoteIP, allowedIP, StringComparison.OrdinalIgnoreCase);
var allowed2 = string.Equals(remoteIP, allowedIP2, StringComparison.OrdinalIgnoreCase);
// Vergleiche die IPs
if (remoteIP == null || !(allowed || allowed2))
{
throw new UnauthorizedAccessException($"Zugriff verweigert. Remote IP ({remoteIP ?? "Unbekannt"}) ist nicht erlaubt.");
}
// Hole erlaubten API Key aus den appSettings
string allowedApikey = ConfigurationManager.AppSettings["AdminServiceAPIKey"];
// Extrahiert den API Key von Remote
var prop = (HttpRequestMessageProperty)request.Properties[HttpRequestMessageProperty.Name];
var remoteApikey = prop?.Headers["admin-service-api-key"];
// Vergleicht die API Keys
if(remoteApikey == null || !string.Equals(remoteApikey, allowedApikey, StringComparison.Ordinal))
{
throw new UnauthorizedAccessException($"Zugriff verweigert. API Key ({remoteApikey ?? "Unbekannt"}) ist nicht erlaubt.");
}
return null; // Keine Zustandsinformationen erforderlich
}
public void BeforeSendReply(ref Message reply, object correlationState)
{
// Keine zusätzliche Logik erforderlich vor dem Senden der Antwort
}
}
}

View File

@@ -0,0 +1,32 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel;
using System.ServiceModel.Channels;
using System.ServiceModel.Description;
using System.ServiceModel.Dispatcher;
using System.Text;
using System.Threading.Tasks;
namespace BeWo.Service.ServiceBehavior.JsonError
{
internal class JsonErrorBehavior : IEndpointBehavior
{
public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
{
}
public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)
{
}
public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)
{
endpointDispatcher.ChannelDispatcher.ErrorHandlers.Add(new JsonErrorHandler());
}
public void Validate(ServiceEndpoint endpoint)
{
}
}
}

View File

@@ -0,0 +1,19 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel.Configuration;
using System.Text;
using System.Threading.Tasks;
namespace BeWo.Service.ServiceBehavior.JsonError
{
public class JsonErrorBehaviorExtension : BehaviorExtensionElement
{
public override Type BehaviorType => typeof(JsonErrorBehavior);
protected override object CreateBehavior()
{
return new JsonErrorBehavior();
}
}
}

View File

@@ -0,0 +1,100 @@
using System;
using System.Collections.Generic;
using System.Configuration;
using System.IO;
using System.Linq;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;
using System.ServiceModel.Channels;
using System.ServiceModel.Dispatcher;
using System.Text;
using System.Threading.Tasks;
using System.Xml;
namespace BeWo.Service.ServiceBehavior.JsonError
{
[DataContract]
public class JsonError
{
[DataMember]
public string Message { get; set; }
[DataMember]
public string StackTrace { get; set; }
[DataMember]
public string ExceptionType { get; set; }
}
public class JsonErrorHandler : IErrorHandler
{
public void ProvideFault(Exception error, MessageVersion version, ref Message fault)
{
// Erstelle eine JSON-Fehlermeldung
var jsonError = new JsonError
{
Message = error.Message,
ExceptionType = error.GetType().Name
};
// Fügt StackTrace hinzu (AppSettings)
string val = ConfigurationManager.AppSettings["AdminServiceEnableStackTrace"];
if(bool.TryParse(val, out bool res) && res)
{
jsonError.StackTrace = error.StackTrace;
}
// Serialisiere das JSON-Objekt
var serializer = new DataContractJsonSerializer(typeof(JsonError));
using (var stream = new MemoryStream())
{
serializer.WriteObject(stream, jsonError);
stream.Position = 0;
using (var reader = new StreamReader(stream))
{
string jsonString = reader.ReadToEnd();
fault = Message.CreateMessage(version, null, new JsonBodyWriter(jsonString));
}
}
// Setze den Content-Type auf application/json
var webBodyFormat = WebBodyFormatMessageProperty.Name;
if (!fault.Properties.ContainsKey(webBodyFormat))
{
fault.Properties.Add(webBodyFormat, new WebBodyFormatMessageProperty(WebContentFormat.Raw));
}
var httpResponse = new HttpResponseMessageProperty
{
StatusCode = System.Net.HttpStatusCode.InternalServerError,
StatusDescription = "Internal Server Error",
};
httpResponse.Headers["Content-Type"] = "application/json";
fault.Properties.Add(HttpResponseMessageProperty.Name, httpResponse);
}
public bool HandleError(Exception error)
{
// Gib an, ob der Fehler behandelt wurde
return true;
}
}
public class JsonBodyWriter : BodyWriter
{
private readonly string _json;
public JsonBodyWriter(string json) : base(true)
{
_json = json;
}
protected override void OnWriteBodyContents(System.Xml.XmlDictionaryWriter writer)
{
writer.WriteStartElement("Binary");
byte[] jsonBytes = Encoding.UTF8.GetBytes(_json);
writer.WriteBase64(jsonBytes, 0, jsonBytes.Length);
writer.WriteEndElement();
}
}
}

View File

@@ -140,37 +140,5 @@ namespace BeWo.Service.ServiceContracts
[FaultContract(typeof(BeWoFault))]
[OperationContract]
void StorniereInvoiceBases(List<InvoiceBaseDC> invoices);
[FaultContract(typeof(BeWoFault))]
[OperationContract]
GkvAbrechnungDC GetGkvAbrechnung(long oid);
[FaultContract(typeof(BeWoFault))]
[OperationContract]
List<GkvAbrechnungDC> GetAllGkvAbrechnungen();
[FaultContract(typeof(BeWoFault))]
[OperationContract]
List<GkvAbrechnungDC> GetFilteredGkvAbrechnungen(GkvAbrechnungViewFilterDC gkvAbrechnungViewFilter);
[FaultContract(typeof(BeWoFault))]
[OperationContract]
GkvAbrechnungCreateResponseDC CreateNewGkvAbrechnung(GkvAbrechnungCreateRequestDC request);
[FaultContract(typeof(BeWoFault))]
[OperationContract]
GkvAbrechnungDC UpdateGkvAbrechnung(GkvAbrechnungDC abrechnung);
[FaultContract(typeof(BeWoFault))]
[OperationContract]
void DeleteGkvAbrechnung(GkvAbrechnungDC abrechnung);
[FaultContract(typeof(BeWoFault))]
[OperationContract]
GkvAbrechnungSendResponseDC SendNewGkvAbrechnung(GkvAbrechnungSendRequestDC req);
[FaultContract(typeof(BeWoFault))]
[OperationContract]
GkvAbrechnungGetIKResponseDC SendGetIKRequest(GkvAbrechnungGetIKRequestDC req);
}
}

View File

@@ -0,0 +1,30 @@
using BS.Shared.Attributes;
using BS.Shared.DataContracts.AdminService;
using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;
using System.Threading.Tasks;
namespace BeWo.Service.ServiceContracts
{
[ServiceContract]
public interface IAdminService
{
[OperationContract]
[WebGet(UriTemplate = "/Test", ResponseFormat = WebMessageFormat.Json)]
[RequireNoTenant]
string Test();
[OperationContract]
[WebInvoke(UriTemplate = "/Echo/{echo}", Method ="POST", ResponseFormat = WebMessageFormat.Json)]
[RequireNoTenant]
string Echo(string echo);
[OperationContract]
[WebInvoke(UriTemplate = "/GetGkvSum", Method = "POST", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
object GetGkvAbrechnungSumme(AdminServiceSumReqDC request);
}
}

View File

@@ -0,0 +1,63 @@
using BS.Shared;
using BS.Shared.Attributes;
using BS.Shared.DataContracts.GkvAbrechnung;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.CompilerServices;
using System.ServiceModel;
using System.Text;
using System.Threading.Tasks;
namespace BeWo.Service.ServiceContracts
{
[ServiceContract]
public interface IGkvAccountingService
{
[FaultContract(typeof(BeWoFault))]
[OperationContract]
[RequirePermission(UserRightType.Finance_Gkv_View)]
GkvAbrechnungDC GetGkvAbrechnung(long oid);
[FaultContract(typeof(BeWoFault))]
[OperationContract]
[RequirePermission(UserRightType.Finance_Gkv_View)]
List<GkvAbrechnungDC> GetAllGkvAbrechnungen();
[FaultContract(typeof(BeWoFault))]
[OperationContract]
[RequirePermission(UserRightType.Finance_Gkv_View)]
List<GkvAbrechnungDC> GetFilteredGkvAbrechnungen(GkvAbrechnungViewFilterDC gkvAbrechnungViewFilter);
[FaultContract(typeof(BeWoFault))]
[OperationContract]
[RequirePermission(UserRightType.Finance_Gkv_View)]
string GetProtokollRawDataString(long oid, GkvRawDataType gkvRawData);
[FaultContract(typeof(BeWoFault))]
[OperationContract]
[RequirePermission(UserRightType.Finance_Gkv_Create)]
GkvAbrechnungCreateResponseDC CreateNewGkvAbrechnung(GkvAbrechnungCreateRequestDC request);
[FaultContract(typeof(BeWoFault))]
[OperationContract]
[RequirePermission(UserRightType.Finance_Gkv_Create)]
GkvAbrechnungDC UpdateGkvAbrechnung(GkvAbrechnungDC abrechnung);
[FaultContract(typeof(BeWoFault))]
[OperationContract]
[RequirePermission(UserRightType.Finance_Gkv_Delete)]
void DeleteGkvAbrechnung(GkvAbrechnungDC abrechnung);
[FaultContract(typeof(BeWoFault))]
[OperationContract]
[RequirePermission(UserRightType.Finance_Gkv_Send)]
GkvAbrechnungSendResponseDC SendNewGkvAbrechnung(GkvAbrechnungSendRequestDC req);
[FaultContract(typeof(BeWoFault))]
[OperationContract]
[RequirePermission(UserRightType.Finance_Gkv_View)]
GkvAbrechnungGetIKResponseDC SendGetIKRequest(GkvAbrechnungGetIKRequestDC req);
}
}

View File

@@ -5,6 +5,7 @@ using BeWo.Data.Entities;
using BS.Shared.DataContracts;
using BS.Shared.DataContracts.Compact;
using BS.Shared;
using BS.Shared.Attributes;
namespace BeWo.Service.ServiceContracts
{
@@ -21,31 +22,38 @@ namespace BeWo.Service.ServiceContracts
[FaultContract(typeof(BeWoFault))]
[OperationContract]
[RequirePermission(UserRightType.UserView_Delete)]
void DeactivateUser(long pOid, long pVersion);
[FaultContract(typeof(BeWoFault))]
[OperationContract]
[RequirePermission(UserRightType.UserGroupView_Delete)]
void DeactivateUserGroup(long pOid, long pVersion);
[FaultContract(typeof(BeWoFault))]
[OperationContract]
void DeactivateUsers(Dictionary<long, long> pOid2Version);
[RequirePermission(UserRightType.UserView_Delete)]
void DeactivateUsers(Dictionary<long, long> pOid2Version);
[FaultContract(typeof(BeWoFault))]
[OperationContract]
void DeleteUser(long pOid, long pVersion);
[RequirePermission(UserRightType.UserView_Delete)]
void DeleteUser(long pOid, long pVersion);
[FaultContract(typeof(BeWoFault))]
[OperationContract]
void DeleteUserGroup(long pOid, long pVersion);
[RequirePermission(UserRightType.UserGroupView_Delete)]
void DeleteUserGroup(long pOid, long pVersion);
[FaultContract(typeof(BeWoFault))]
[OperationContract]
[RequirePermission(UserRightType.UserGroupView_Delete)]
void DeleteUserGroups(Dictionary<long, long> pOid2Version);
[FaultContract(typeof(BeWoFault))]
[OperationContract]
void DeleteUsers(Dictionary<long, long> pOid2Version);
[RequirePermission(UserRightType.UserView_Delete)]
void DeleteUsers(Dictionary<long, long> pOid2Version);
[FaultContract(typeof(BeWoFault))]
[OperationContract]
@@ -69,10 +77,12 @@ namespace BeWo.Service.ServiceContracts
[FaultContract(typeof(BeWoFault))]
[OperationContract]
long InsertNewUser(UserDC pUser);
[RequirePermission(UserRightType.UserGroupView_Create)]
long InsertNewUser(UserDC pUser);
[FaultContract(typeof(BeWoFault))]
[OperationContract]
[RequirePermission(UserRightType.UserGroupView_Create)]
long InsertNewUserGroup(UserGroupDC pUserGroup);
[FaultContract(typeof(BeWoFault))]
@@ -105,6 +115,7 @@ namespace BeWo.Service.ServiceContracts
[FaultContract(typeof(BeWoFault))]
[OperationContract]
[RequirePermission(UserRightType.UserGroupView_Edit, UserRightType.EditAll)]
long UpdateUserGroup(UserGroupDC pUserGroup);
[FaultContract(typeof(BeWoFault))]

View File

@@ -745,628 +745,5 @@ namespace BeWo.Service.ServiceImplementations
throw Utils.CreateBeWoFaultException(e);
}
}
#region GKV
public GkvAbrechnungDC GetGkvAbrechnung(long oid)
{
try
{
var gkv = DAOFactory.GenericDAO.GetByID<GkvAbrechnung>(oid);
var dc = MapperFactory.GkvAbrechnungDC_GkvAbrechnung.MapToNewDC(gkv);
return dc;
}
catch (Exception e)
{
throw Utils.CreateBeWoFaultException(e);
}
}
public List<GkvAbrechnungDC> GetFilteredGkvAbrechnungen(GkvAbrechnungViewFilterDC gkvAbrechnungViewFilter)
{
try
{
if (gkvAbrechnungViewFilter == null || !gkvAbrechnungViewFilter.FilterTime)
return GetAllGkvAbrechnungen();
var start = gkvAbrechnungViewFilter.Start;
var end = gkvAbrechnungViewFilter.End;
var filter = gkvAbrechnungViewFilter.FilterForInvoiceDate;
return GetGkvAbrechnungen(() => DAOFactory.SearchDAO.GetGkvAbrechnungen(start, end, filter));
}
catch (Exception e)
{
throw Utils.CreateBeWoFaultException(e);
}
}
public List<GkvAbrechnungDC> GetAllGkvAbrechnungen()
{
try
{
return GetGkvAbrechnungen(() => DAOFactory.GenericDAO.GetAllActive<GkvAbrechnung>());
}
catch (Exception e)
{
throw Utils.CreateBeWoFaultException(e);
}
}
private List<GkvAbrechnungDC> GetGkvAbrechnungen(Func<IEnumerable<GkvAbrechnung>> get_entities)
{
var entities = get_entities();
var dcs = MapperFactory.GkvAbrechnungDC_GkvAbrechnung.MapToNewDCs(entities);
var updateables = dcs.Where(x => x.IsWaiting()).ToArray();
if (!updateables.Any())
return dcs;
var isUpToDate = SendApp8GetStatusRequest(updateables);
if (isUpToDate)
return dcs;
entities = get_entities();
dcs = MapperFactory.GkvAbrechnungDC_GkvAbrechnung.MapToNewDCs(entities);
return dcs;
}
public List<CompactGkvAbrechnungDC> GetCompactGkvAbrechnungByTransferDateRange(DateTime? start, DateTime? end)
{
try
{
var entities = DAOFactory.SearchDAO.GetGkvTransferProtokollByDateRange(start, end);
var filter = entities.Where(x => x.SentDakotaSuccess);
var oids = filter.Select(x => x.GkvAbrechnungOid).Distinct();
if (!oids.Any())
return null;
var list = new List<GkvAbrechnung>();
foreach (var oid in oids)
{
var abrechnung = DAOFactory.GenericDAO.LoadByID<GkvAbrechnung>(oid);
list.Add(abrechnung);
}
return MapperFactory.CompactGkvAbrechnungDC_GkvAbrechnung.MapToNewDCs(list);
}
catch (Exception e)
{
throw Utils.CreateBeWoFaultException(e);
}
}
public GkvAbrechnungCreateResponseDC CreateNewGkvAbrechnung(GkvAbrechnungCreateRequestDC request)
{
var response = new GkvAbrechnungCreateResponseDC();
try
{
var invoice_bases = DAOFactory.GenericDAO.LoadByIDs<InvoiceBase>(request.SelectedInvoiceBases);
ValidatorExtended.ValidateGkvAbrechnung(request.GkvAbrechnungDC, invoice_bases);
var gkv_abrechnung = MapperFactory.GkvAbrechnungDC_GkvAbrechnung.MapToNewEntity(request.GkvAbrechnungDC);
if (gkv_abrechnung.AbrechnungsZeitraumEnde.Value.Hour == 0)
{
gkv_abrechnung.AbrechnungsZeitraumEnde = gkv_abrechnung.AbrechnungsZeitraumEnde.Value.Date.AddDays(1).AddMilliseconds(-1);
}
var orga = gkv_abrechnung.Organisation;
gkv_abrechnung.Verfahrensstufe = orga.Verfahrensstufe;
decimal gesamt = 0;
foreach (var invoicebase_oid in request.SelectedInvoiceBases)
{
var service = DAOFactory.SearchDAO.GetServiceInvoiceByInvoiceBaseOid(invoicebase_oid);
foreach (var peroid in service.ServiceInvoicePeriodList)
{
foreach (var invoice in peroid.InvoiceItemList)
{
gesamt += invoice.AmountTotal.Value;
}
}
}
gkv_abrechnung.Betrag = gesamt;
gkv_abrechnung.Bezahlt = false;
gkv_abrechnung.ErstelltAm = DateTime.Now;
DAOFactory.GenericDAO.Insert(gkv_abrechnung);
var gkv_abrechnung_dc = MapperFactory.GkvAbrechnungDC_GkvAbrechnung.MapToNewDC(gkv_abrechnung);
response.Success = true;
response.GkvAbrechnungDC = gkv_abrechnung_dc;
}
catch (GkvException exc)
{
MailUtils.SendGkvModuleErrorMail("CreateNewGkvAbrechnung", exc, Tenant);
if (exc.Title.IsNotNullOrWhiteSpace())
response.TitleMessage = exc.Title;
response.Message = exc.Message;
}
catch (Exception e)
{
MailUtils.SendGkvModuleErrorMail("CreateNewGkvAbrechnung", e, Tenant);
throw Utils.CreateBeWoFaultException(e);
}
return response;
}
public GkvAbrechnungDC UpdateGkvAbrechnung(GkvAbrechnungDC abrechnung)
{
try
{
var entity = DAOFactory.GenericDAO.GetByID<GkvAbrechnung>(abrechnung.GkvAbrechnungOid.Value);
MapperFactory.GkvAbrechnungDC_GkvAbrechnung.MergeWithEntity(abrechnung, entity);
foreach (var invoice in entity.InvoiceBases)
{
invoice.IsPaid = entity.Bezahlt;
}
DAOFactory.GenericDAO.Update(entity);
return MapperFactory.GkvAbrechnungDC_GkvAbrechnung.MapToNewDC(entity);
}
catch (Exception e)
{
throw Utils.CreateBeWoFaultException(e);
}
}
public void DeleteGkvAbrechnung(GkvAbrechnungDC abrechnung)
{
try
{
ServiceLogic.SetActivationType<GkvAbrechnung>(abrechnung.GkvAbrechnungOid.Value, abrechnung.GkvAbrechnungVersion.Value, ActivationTypeId.Deleted);
}
catch (Exception e)
{
throw Utils.CreateBeWoFaultException(e);
}
}
public GkvAbrechnungSendResponseDC SendNewGkvAbrechnung(GkvAbrechnungSendRequestDC req)
{
var response = new GkvAbrechnungSendResponseDC();
var oid = req.GkvAbrechnungOid;
var entity = DAOFactory.GenericDAO.LoadByID<GkvAbrechnung>(oid);
var state = entity.GetState();
if (entity.IsWaiting() || state == GkvState.Paid)
{
response.Message = "Validierung fehlgeschlagen";
return response;
}
var protokoll = CreateGkvTransferProtokoll(entity, out var error);
if (error is object)
{
MailUtils.SendGkvModuleErrorMail("SendNewGkvAbrechnung - CreateGkvTransferProtokoll", error, Tenant);
response.TitleMessage = "Protokoll Erstellung";
response.Message = error;
return response;
}
if (entity.GkvTransferProtokolle is null)
entity.GkvTransferProtokolle = new List<GkvTransferProtokoll>();
entity.GkvTransferProtokolle.Add(protokoll);
// Protokoll braucht Oid
DAOFactory.GenericDAO.Update(entity);
try
{
var app8_response = SendApp8SendNewRequest(protokoll);
var app8_protokoll = app8_response.GkvTransferProtokollDC;
MapperFactory.GkvTransferProtokollDC_GkvTransferprotokoll.MergeWithEntity(app8_protokoll, protokoll);
response.Success = app8_response.Success;
response.Message = app8_response.Message;
}
catch (GkvException de)
{
protokoll.ResultType = GkvTransferResultType.FailSoft;
protokoll.Fehlerdatum = DateTime.Now;
protokoll.Fehlernachricht = de.Message;
protokoll.Fehlertitel = de.Title ?? "Default";
}
catch (Exception e)
{
protokoll.ResultType = GkvTransferResultType.FailFatal;
protokoll.Fehlerdatum = DateTime.Now;
protokoll.Fehlernachricht = e.ToString();
protokoll.Fehlertitel = "Erstellung (kritisch)";
}
DAOFactory.GenericDAO.Update(entity);
response.TransferProtokoll = MapperFactory.GkvTransferProtokollDC_GkvTransferprotokoll.MapToNewDC(protokoll);
response.GkvAbrechnungDC = MapperFactory.GkvAbrechnungDC_GkvAbrechnung.MapToNewDC(entity);
return response;
}
public GkvAbrechnungGetIKResponseDC SendGetIKRequest(GkvAbrechnungGetIKRequestDC req)
{
try
{
var app8req = new GkvServerGetIKRequestDC
{
IKKrankenkasse = req.IKKrankenkasse,
Leistungserbringergruppe = req.Leistungserbringergruppe,
Abrechnungscode = DakotaUtils.GetAbrechnungscode(req.Leistungserbringergruppe),
Tarifkennzeichen = DakotaUtils.GetTarifkennzeichen(req.Leistungserbringergruppe)
};
var app8res = SendApp8Request<GkvServerGetIKRequestDC, GkvServerGetIKResponseDC>(app8req);
// Erstelle Response
var res = new GkvAbrechnungGetIKResponseDC
{
BezDatenannahmestelle = app8res.BezDatenannahmestelle,
Gefunden = app8res.Gefunden,
IKDatenannahmestelle = app8res.IKDatenannahmestelle,
IKKostentrager = app8res.IKKostentrager,
IKKrankenkasse = app8res.IKKrankenkasse,
Message = app8res.Message,
Success = app8res.Success
};
// Schaue, ob IK Krankenkassen bereits bei einer anderen Organisation hinterlegt ist
if (res.Gefunden)
{
// Holt alle Organisationen
var orgas = DAOFactory.SearchDAO.GetAllOrganisationByIKKrankenkasse(req.IKKrankenkasse);
// Entfernt sich selber
if (req.OrganisationOid is long oid)
{
orgas.RemoveAll(x => x.Oid == oid);
}
if (orgas.Any())
{
res.BereitsEnthalten = true;
res.BereitsEnthaltenBei = orgas.Select(x => x.Name).ToList();
}
}
return res;
}
catch (Exception e)
{
throw Utils.CreateBeWoFaultException(e);
}
}
private GkvTransferProtokoll CreateGkvTransferProtokoll(GkvAbrechnung gkvAbrechnung, out string error)
{
var protokoll = new GkvTransferProtokoll
{
ErstelltAm = DateTime.Now,
GkvAbrechnungOid = gkvAbrechnung.Oid.Value
};
error = null;
try
{
ValidatorExtended.ValidateGkvAbrechnung(gkvAbrechnung, gkvAbrechnung.InvoiceBases);
var manager = new DakotaManager();
var mandatordc = new OperationsServiceImp().GetMandator();
Validator.ValidateMandator(mandatordc);
var gkvAbrechnungDC = MapperFactory.GkvAbrechnungDC_GkvAbrechnung.MapToNewDC(gkvAbrechnung);
var orgadc = gkvAbrechnungDC.Organisation;
Validator.ValidateOrganisation(orgadc);
var datenannahmestelle = orgadc.IKDatenannahmestelle;
var (datenaustauschreferenz, transfernummer) = GetNextDatenaustauschreferenzTransfernummer(gkvAbrechnung, datenannahmestelle);
var (dat_short, tra_short) = ClearDatenaustauschreferenzTransfernummer(datenaustauschreferenz, transfernummer);
var first_cost = gkvAbrechnung.InvoiceBases.First().CostBearer2SupportConcept.SupportConcept.Customer;
var plugin = PluginLoader.FindClass<AccountingService>();
var addressInfo = plugin.GetAddressInformation(first_cost.Oid);
foreach (var invoicebase in gkvAbrechnung.InvoiceBases)
{
var customer = invoicebase.CostBearer2SupportConcept.SupportConcept.Customer;
var addressInfo2 = plugin.GetAddressInformation(customer.Oid);
if (addressInfo.IKLeistungserbringer != addressInfo2.IKLeistungserbringer)
{
throw new GkvException($"Klient '{first_cost.Person.LastNameFirstName}' ({addressInfo.IKLeistungserbringer}) und '{customer.Person.LastNameFirstName}' ({addressInfo2.IKLeistungserbringer}) verweisen auf unterschiedliche Leistungserbringer.");
}
}
foreach (var invoicebase in gkvAbrechnung.InvoiceBases)
{
var service = DAOFactory.SearchDAO.GetServiceInvoiceByInvoiceBaseOid(invoicebase.Oid.Value);
var orga2 = invoicebase.CostBearer2SupportConcept.CostBearer.Organisation;
var customer = invoicebase.CostBearer2SupportConcept.SupportConcept.Customer;
var invoicebase_dc = MapperFactory.InvoiceBaseDC_InvoiceBase.MapToNewDC(invoicebase);
var servicedc = MapperFactory.ServiceInvoiceDC_ServiceInvoice.MapToNewDC(service);
var customerdc = MapperFactory.CustomerDC_Customer.MapToNewDC(customer);
Validator.ValidateCustomer(customerdc);
manager.Add(servicedc, orgadc, customerdc, addressInfo, dat_short, tra_short);
}
manager.Apply();
if (manager.DakotaFileDict.Count != 1 || manager.DakotaFileDict.First().Value.GetKostenträgerCount() != 1)
{
var msg = "Unerwartete Anzahl an Dakota Files berechnet.";
throw new GkvException(msg);
}
var file_from_manager = manager.DakotaFileDict.First().Value;
var nutzdatendatei = file_from_manager.GetNutzdatendatei();
// https://dev.mysql.com/doc/refman/8.3/en/string-type-syntax.html
// A TEXT column with a maximum length of 16,777,215 (224 1) characters.
// The effective maximum length is less if the value contains multibyte characters.
// Each MEDIUMTEXT value is stored using a 3-byte length prefix that indicates the number of bytes in the value.
//
// Type | Maximum length
// -----------+-------------------------------------
// TINYTEXT | 255(2^81) bytes
// TEXT | 65,535(2^161) bytes = 64 KiB
// MEDIUMTEXT | 16,777,215(2^241) bytes = 16 MiB
// LONGTEXT | 4,294,967,295(2^321) bytes = 4 GiB
if (nutzdatendatei.Length > 16777215)
{
var msg = $"nutzdatendatei - Länger als 16777215: {nutzdatendatei.Length}";
throw new GkvException(msg);
}
protokoll.Datenaustauschreferenz = datenaustauschreferenz;
protokoll.Transfernummer = transfernummer;
protokoll.IKDatenannahmestelle = file_from_manager.GetIKDatenannahmestelle();
protokoll.IKKostentrager = file_from_manager.GetIKKostenträger();
protokoll.IKLeistungserbringer = file_from_manager.GetIKLeistungserbringer();
protokoll.IKKrankenkasse = file_from_manager.GetIKVersichertenKarte();
protokoll.Rechnungsnummer = file_from_manager.GetRechnungsnummer();
protokoll.Auftragsdatei = file_from_manager.GetAuftragsdatei();
protokoll.Nutzdatendatei = nutzdatendatei;
protokoll.Transfername = file_from_manager.GetTransferName();
protokoll.Dateigrosse = nutzdatendatei.Length;
protokoll.Dateityp = "Nutzdatendatei";
protokoll.Dateiname = protokoll.Transfername;
protokoll.AbsenderBezeichnung = "ownSoft GmbH";
protokoll.EmpfangerBezeichnung = orgadc.BezDatenannahmestelle;
return protokoll;
}
catch (GkvException de)
{
error = de.ToString();
}
catch (Exception e)
{
error = e.ToString();
}
return null;
}
private Tuple<int, int> GetNextDatenaustauschreferenzTransfernummer(GkvAbrechnung gkvAbrechnung, string datenannahmestelle)
{
var datenaustauschref = DAOFactory.SearchDAO.GetNextDatenaustauschreferenz(datenannahmestelle);
int transfernummer;
var state = gkvAbrechnung.GetState();
if (state == GkvState.NoSend)
{
transfernummer = DAOFactory.SearchDAO.GetNextTransfernummer(datenannahmestelle);
}
else if (state == GkvState.ErrorSoft || state == GkvState.ErrorFatal || state == GkvState.ErrorFolgefehler)
{
transfernummer = gkvAbrechnung.GkvTransferProtokolle.Last().Transfernummer;
}
else
{
throw new ArgumentException($"Versucht Transfernummer zu laden, invalid state: {state}", nameof(state));
}
return new Tuple<int, int>(datenaustauschref, transfernummer);
}
private Tuple<int, int> ClearDatenaustauschreferenzTransfernummer(int datenaustauschreferenz, int transfernummer)
{
int d = datenaustauschreferenz % 99999;
int t = transfernummer % 1000;
if (d == 0)
{
d = 99999;
}
return new Tuple<int, int>(d, t);
}
private GkvServerSendNewResponseDC SendApp8SendNewRequest(GkvTransferProtokoll protokoll)
{
var gkv_transfer_dc = MapperFactory.GkvTransferProtokollDC_GkvTransferprotokoll.MapToNewDC(protokoll);
var request_app8 = new GkvServerSendNewRequestDC
{
Protokoll = gkv_transfer_dc
};
var response_app8 = SendApp8Request<GkvServerSendNewRequestDC, GkvServerSendNewResponseDC>(request_app8);
if (!response_app8.Success)
throw new GkvException(response_app8.Message);
return response_app8;
}
/// <summary>
///
/// </summary>
/// <param name="updateables"></param>
/// <param name="loginName"></param>
/// <param name="hashed_password"></param>
/// <returns>Returns true, if the states are all up to date. False otherwise.</returns>
private bool SendApp8GetStatusRequest(GkvAbrechnungDC[] updateables)
{
var updateables_len = updateables.Count();
var request = new GkvServerGetStatusRequestDC
{
Tenant = MultitenancyOperationContextExt.Current.Tenant,
Oids = new long[updateables_len]
};
for (int id = 0; id < updateables_len; id++)
{
var gkv_abrechnung = updateables[id];
var gkv_transfer = gkv_abrechnung.TransferProtokolle.Last();
request.Oids[id] = gkv_transfer.GkvTransferProtokollOid.Value;
}
GkvServerGetStatusResponseDC response_app8;
try
{
response_app8 = SendApp8Request<GkvServerGetStatusRequestDC, GkvServerGetStatusResponseDC>(request);
}
catch (Exception e)
{
MailUtils.SendGkvModuleErrorMail("GkvServerGetStatusRequest Error", e, Tenant);
return true;
}
if (!response_app8.Success)
throw new GkvException("Success false - " + response_app8.Message);
if (response_app8.Results is null)
throw new GkvException("Result null - " + response_app8.Message);
var results = response_app8.Results.Where(x => x is object);
if (!results.Any())
return true;
HandleGkvServerResults(results);
return false;
}
public void HandleGkvServerResults(IEnumerable<GkvServerResultDC> results)
{
var protokolls = new List<GkvTransferProtokoll>();
foreach (var result in results)
{
var protokoll = DAOFactory.GenericDAO.GetByID<GkvTransferProtokoll>(result.ProtokollOid);
protokoll.ResultType = result.ResultType;
protokoll.Fehlertitel = result.Titel;
protokoll.Fehlerdatum = result.Datum;
protokoll.Fehlernachricht = result.Nachricht;
switch (result.ResultType)
{
case GkvTransferResultType.Success:
protokoll.SentDakotaSuccess = true;
break;
case GkvTransferResultType.FailSoft:
protokoll.SentApp8Success = false;
break;
case GkvTransferResultType.FailFatal:
protokoll.SentApp8Success = false;
break;
case GkvTransferResultType.FailFollowUp:
protokoll.SentApp8Success = false;
break;
}
protokolls.Add(protokoll);
}
if (protokolls.Any())
DAOFactory.GenericDAO.Update(protokolls);
var follows = results.Where(x => x.ResultType == GkvTransferResultType.FailFollowUp);
if (follows.Any())
{
foreach (var follow in follows)
{
var protokoll_oid = follow.ProtokollOid;
var protokoll = DAOFactory.GenericDAO.LoadByID<GkvTransferProtokoll>(protokoll_oid);
var abrechnung_oid = protokoll.GkvAbrechnungOid;
var new_req = new GkvAbrechnungSendRequestDC()
{
GkvAbrechnungOid = abrechnung_oid
};
var res = SendNewGkvAbrechnung(new_req);
if (!res.Success)
throw new GkvException("Success - " + res.Message);
}
}
}
private Res SendApp8Request<Req, Res>(Req request) where Req : GkvServerRequestDC where Res : GkvResponseDC
{
var user = LoggedInUserOperationContextExt.Current?.User ?? SessionFacade.LoggedInUser;
if (user == null)
{
throw new GkvException("User unbekannt", "KundenApp");
}
request.Username = user.LoginName;
request.Password = user.BCryptPassword;
request.Tenant = MultitenancyOperationContextExt.Current.Tenant;
if (request is GkvServerSendNewRequestDC send_new_req)
{
send_new_req.ApplicationUserOid = user.Oid.Value;
}
return GkvSender.SendApp8Request<Req, Res>(request, request.Tenant);
}
#endregion
}
}

View File

@@ -0,0 +1,50 @@
using BeWo.Data.Access;
using BeWo.Service.ServiceContracts;
using BS.Shared.Core;
using BS.Shared.DataContracts.AdminService;
using DevExpress.Pdf.Native.BouncyCastle.Ocsp;
using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel;
using System.Text;
using System.Threading.Tasks;
namespace BeWo.Service.ServiceImplementations
{
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall, ConcurrencyMode = ConcurrencyMode.Single)]
public class AdminServiceImp : IAdminService
{
public string Test()
{
return "Test erfolgreich!";
}
public string Echo(string echo)
{
return echo;
}
public object GetGkvAbrechnungSumme(AdminServiceSumReqDC request)
{
if (request == null)
{
throw new ArgumentException("request darf nicht null sein");
}
if(!Utils.TryParseISO8601(request.Start, out var start))
{
throw new ArgumentException("start entspricht nicht ISO8601 Norm.");
}
if (!Utils.TryParseISO8601(request.End, out var end))
{
throw new ArgumentException("end entspricht nicht ISO8601 Norm.");
}
var sum = DAOFactory.ScriptDAO.GetGkvSumByDateRange(start, end);
return sum?.ToString("0.00");
}
}
}

View File

@@ -0,0 +1,669 @@
using BeWo.Data;
using BeWo.Data.Access;
using BeWo.Data.Entities;
using BeWo.Service.Core;
using BeWo.Service.DCEntityMapper;
using BeWo.Service.Plugins;
using BeWo.Service.ServiceContracts;
using BS.Shared;
using BS.Shared.AppSender;
using BS.Shared.Core;
using BS.Shared.DataContracts.GkvAbrechnung;
using BS.Shared.Exceptions;
using BS.Shared.Extensions;
using Dakota;
using Dakota.Logic;
using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel;
using System.Text;
using System.Threading.Tasks;
using Utils = BeWo.Service.Core.Utils;
namespace BeWo.Service.ServiceImplementations
{
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall, ConcurrencyMode = ConcurrencyMode.Single)]
public class GkvAccountingServiceImp : IGkvAccountingService
{
public string Tenant => MultitenancyOperationContextExt.Current?.Tenant;
public GkvAbrechnungDC GetGkvAbrechnung(long oid)
{
try
{
var gkv = DAOFactory.GenericDAO.GetByID<GkvAbrechnung>(oid);
var dc = MapperFactory.GkvAbrechnungDC_GkvAbrechnung.MapToNewDC(gkv);
MapperFactory.GkvAbrechnungDC_GkvAbrechnung.ClearRawData(dc);
return dc;
}
catch (Exception e)
{
throw Utils.CreateBeWoFaultException(e);
}
}
public List<GkvAbrechnungDC> GetFilteredGkvAbrechnungen(GkvAbrechnungViewFilterDC gkvAbrechnungViewFilter)
{
try
{
if (gkvAbrechnungViewFilter == null || !gkvAbrechnungViewFilter.FilterTime)
return GetAllGkvAbrechnungen();
var start = gkvAbrechnungViewFilter.Start;
var end = gkvAbrechnungViewFilter.End;
var filter = gkvAbrechnungViewFilter.FilterForInvoiceDate;
return GetGkvAbrechnungen(() => DAOFactory.SearchDAO.GetGkvAbrechnungen(start, end, filter));
}
catch (Exception e)
{
throw Utils.CreateBeWoFaultException(e);
}
}
public List<GkvAbrechnungDC> GetAllGkvAbrechnungen()
{
try
{
return GetGkvAbrechnungen(() => DAOFactory.GenericDAO.GetAllActive<GkvAbrechnung>());
}
catch (Exception e)
{
throw Utils.CreateBeWoFaultException(e);
}
}
private List<GkvAbrechnungDC> GetGkvAbrechnungen(Func<IEnumerable<GkvAbrechnung>> get_entities)
{
var entities = get_entities();
var dcs = MapperFactory.GkvAbrechnungDC_GkvAbrechnung.MapToNewDCs(entities);
MapperFactory.GkvAbrechnungDC_GkvAbrechnung.ClearRawData(dcs);
var updateables = dcs.Where(x => x.IsWaiting()).ToArray();
if (!updateables.Any())
return dcs;
var isUpToDate = SendApp8GetStatusRequest(updateables);
if (isUpToDate)
return dcs;
entities = get_entities();
dcs = MapperFactory.GkvAbrechnungDC_GkvAbrechnung.MapToNewDCs(entities);
MapperFactory.GkvAbrechnungDC_GkvAbrechnung.ClearRawData(dcs);
return dcs;
}
public string GetProtokollRawDataString(long oid, GkvRawDataType gkvRawData)
{
try
{
if (oid <= 0)
{
throw new ArgumentOutOfRangeException(nameof(oid), $"oid \'{oid}\' nicht positiv");
}
var str = DAOFactory.SearchDAO.GetGkvRawData(oid, gkvRawData);
return str;
}
catch (Exception e)
{
throw Utils.CreateBeWoFaultException(e);
}
}
public GkvAbrechnungCreateResponseDC CreateNewGkvAbrechnung(GkvAbrechnungCreateRequestDC request)
{
var response = new GkvAbrechnungCreateResponseDC();
try
{
var invoice_bases = DAOFactory.GenericDAO.LoadByIDs<InvoiceBase>(request.SelectedInvoiceBases);
ValidatorExtended.ValidateGkvAbrechnung(request.GkvAbrechnungDC, invoice_bases);
var gkv_abrechnung = MapperFactory.GkvAbrechnungDC_GkvAbrechnung.MapToNewEntity(request.GkvAbrechnungDC);
if (gkv_abrechnung.AbrechnungsZeitraumEnde.Value.Hour == 0)
{
gkv_abrechnung.AbrechnungsZeitraumEnde = gkv_abrechnung.AbrechnungsZeitraumEnde.Value.Date.AddDays(1).AddMilliseconds(-1);
}
var orga = gkv_abrechnung.Organisation;
gkv_abrechnung.Verfahrensstufe = orga.Verfahrensstufe;
decimal gesamt = 0;
foreach (var invoicebase_oid in request.SelectedInvoiceBases)
{
var service = DAOFactory.SearchDAO.GetServiceInvoiceByInvoiceBaseOid(invoicebase_oid);
foreach (var peroid in service.ServiceInvoicePeriodList)
{
foreach (var invoice in peroid.InvoiceItemList)
{
gesamt += invoice.AmountTotal.Value;
}
}
}
gkv_abrechnung.Betrag = gesamt;
gkv_abrechnung.Bezahlt = false;
gkv_abrechnung.ErstelltAm = DateTime.Now;
DAOFactory.GenericDAO.Insert(gkv_abrechnung);
var gkv_abrechnung_dc = MapperFactory.GkvAbrechnungDC_GkvAbrechnung.MapToNewDC(gkv_abrechnung);
response.Success = true;
response.GkvAbrechnungDC = gkv_abrechnung_dc;
}
catch (GkvException exc)
{
MailUtils.SendGkvModuleErrorMail("CreateNewGkvAbrechnung", exc, Tenant);
if (exc.Title.IsNotNullOrWhiteSpace())
response.TitleMessage = exc.Title;
response.Message = exc.Message;
}
catch (Exception e)
{
MailUtils.SendGkvModuleErrorMail("CreateNewGkvAbrechnung", e, Tenant);
throw Utils.CreateBeWoFaultException(e);
}
return response;
}
public GkvAbrechnungDC UpdateGkvAbrechnung(GkvAbrechnungDC abrechnung)
{
try
{
var entity = DAOFactory.GenericDAO.GetByID<GkvAbrechnung>(abrechnung.GkvAbrechnungOid.Value);
if(entity.Notice != abrechnung.Notice)
entity.Notice = abrechnung.Notice;
if (entity.UrbelegeGesendet != abrechnung.UrbelegeGesendet)
entity.UrbelegeGesendet = abrechnung.UrbelegeGesendet;
if (entity.Bezahlt != abrechnung.Bezahlt)
{
entity.Bezahlt = abrechnung.Bezahlt;
foreach (var invoice in entity.InvoiceBases)
{
invoice.IsPaid = entity.Bezahlt;
}
}
DAOFactory.GenericDAO.Update(entity);
var dc = MapperFactory.GkvAbrechnungDC_GkvAbrechnung.MapToNewDC(entity);
MapperFactory.GkvAbrechnungDC_GkvAbrechnung.ClearRawData(dc);
return dc;
}
catch (Exception e)
{
throw Utils.CreateBeWoFaultException(e);
}
}
public void DeleteGkvAbrechnung(GkvAbrechnungDC abrechnung)
{
try
{
ServiceLogic.SetActivationType<GkvAbrechnung>(abrechnung.GkvAbrechnungOid.Value, abrechnung.GkvAbrechnungVersion.Value, ActivationTypeId.Deleted);
}
catch (Exception e)
{
throw Utils.CreateBeWoFaultException(e);
}
}
/// <summary>
/// Erstellt GkvTransferProtokoll
/// </summary>
/// <param name="req"></param>
/// <returns></returns>
public GkvAbrechnungSendResponseDC SendNewGkvAbrechnung(GkvAbrechnungSendRequestDC req)
{
var response = new GkvAbrechnungSendResponseDC();
var oid = req.GkvAbrechnungOid;
var entity = DAOFactory.GenericDAO.LoadByID<GkvAbrechnung>(oid);
var state = entity.GetState();
if (entity.IsWaiting() || state == GkvState.Paid)
{
response.Message = "Validierung fehlgeschlagen";
return response;
}
var protokoll = CreateGkvTransferProtokoll(entity, out var error);
if (error is object)
{
MailUtils.SendGkvModuleErrorMail("SendNewGkvAbrechnung - CreateGkvTransferProtokoll", error, Tenant);
response.TitleMessage = "Protokoll Erstellung";
response.Message = error;
return response;
}
if (entity.GkvTransferProtokolle is null)
entity.GkvTransferProtokolle = new List<GkvTransferProtokoll>();
entity.GkvTransferProtokolle.Add(protokoll);
// Protokoll braucht Oid
DAOFactory.GenericDAO.Update(entity);
try
{
var app8_response = SendApp8SendNewRequest(protokoll);
var app8_protokoll = app8_response.GkvTransferProtokollDC;
MapperFactory.GkvTransferProtokollDC_GkvTransferprotokoll.MergeWithEntity(app8_protokoll, protokoll);
response.Success = app8_response.Success;
response.Message = app8_response.Message;
}
catch (GkvException de)
{
protokoll.ResultType = GkvTransferResultType.FailSoft;
protokoll.Fehlerdatum = DateTime.Now;
protokoll.Fehlernachricht = de.Message;
protokoll.Fehlertitel = de.Title ?? "Default";
}
catch (Exception e)
{
protokoll.ResultType = GkvTransferResultType.FailFatal;
protokoll.Fehlerdatum = DateTime.Now;
protokoll.Fehlernachricht = e.ToString();
protokoll.Fehlertitel = "Erstellung (kritisch)";
}
DAOFactory.GenericDAO.Update(entity);
response.TransferProtokoll = MapperFactory.GkvTransferProtokollDC_GkvTransferprotokoll.MapToNewDC(protokoll);
response.GkvAbrechnungDC = MapperFactory.GkvAbrechnungDC_GkvAbrechnung.MapToNewDC(entity);
MapperFactory.GkvTransferProtokollDC_GkvTransferprotokoll.ClearRawData(response.TransferProtokoll);
MapperFactory.GkvAbrechnungDC_GkvAbrechnung.ClearRawData(response.GkvAbrechnungDC);
return response;
}
public GkvAbrechnungGetIKResponseDC SendGetIKRequest(GkvAbrechnungGetIKRequestDC req)
{
try
{
var app8req = new GkvServerGetIKRequestDC
{
IKKrankenkasse = req.IKKrankenkasse,
Leistungserbringergruppe = req.Leistungserbringergruppe,
Abrechnungscode = DakotaUtils.GetAbrechnungscode(req.Leistungserbringergruppe),
Tarifkennzeichen = DakotaUtils.GetTarifkennzeichen(req.Leistungserbringergruppe)
};
var app8res = SendApp8Request<GkvServerGetIKRequestDC, GkvServerGetIKResponseDC>(app8req);
// Erstelle Response
var res = new GkvAbrechnungGetIKResponseDC
{
BezDatenannahmestelle = app8res.BezDatenannahmestelle,
Gefunden = app8res.Gefunden,
IKDatenannahmestelle = app8res.IKDatenannahmestelle,
IKKostentrager = app8res.IKKostentrager,
IKKrankenkasse = app8res.IKKrankenkasse,
Message = app8res.Message,
Success = app8res.Success
};
// Schaue, ob IK Krankenkassen bereits bei einer anderen Organisation hinterlegt ist
if (res.Gefunden)
{
// Holt alle Organisationen
var orgas = DAOFactory.SearchDAO.GetAllOrganisationByIKKrankenkasse(req.IKKrankenkasse);
// Entfernt sich selber
if (req.OrganisationOid is long oid)
{
orgas.RemoveAll(x => x.Oid == oid);
}
if (orgas.Any())
{
res.BereitsEnthalten = true;
res.BereitsEnthaltenBei = orgas.Select(x => x.Name).ToList();
}
}
return res;
}
catch (Exception e)
{
throw Utils.CreateBeWoFaultException(e);
}
}
private GkvTransferProtokoll CreateGkvTransferProtokoll(GkvAbrechnung gkvAbrechnung, out string error)
{
var protokoll = new GkvTransferProtokoll
{
ErstelltAm = DateTime.Now,
GkvAbrechnungOid = gkvAbrechnung.Oid.Value
};
error = null;
try
{
ValidatorExtended.ValidateGkvAbrechnung(gkvAbrechnung, gkvAbrechnung.InvoiceBases);
var manager = new DakotaManager();
var mandatordc = new OperationsServiceImp().GetMandator();
Validator.ValidateMandator(mandatordc);
var gkvAbrechnungDC = MapperFactory.GkvAbrechnungDC_GkvAbrechnung.MapToNewDC(gkvAbrechnung);
var orgadc = gkvAbrechnungDC.Organisation;
Validator.ValidateOrganisation(orgadc);
var datenannahmestelle = orgadc.IKDatenannahmestelle;
var (datenaustauschreferenz, transfernummer) = GetNextDatenaustauschreferenzTransfernummer(gkvAbrechnung, datenannahmestelle);
var (dat_short, tra_short) = ClearDatenaustauschreferenzTransfernummer(datenaustauschreferenz, transfernummer);
var first_cost = gkvAbrechnung.InvoiceBases.First().CostBearer2SupportConcept.SupportConcept.Customer;
var plugin = PluginLoader.FindClass<AccountingService>();
var addressInfo = plugin.GetAddressInformation(first_cost.Oid);
foreach (var invoicebase in gkvAbrechnung.InvoiceBases)
{
var customer = invoicebase.CostBearer2SupportConcept.SupportConcept.Customer;
var addressInfo2 = plugin.GetAddressInformation(customer.Oid);
if (addressInfo.IKLeistungserbringer != addressInfo2.IKLeistungserbringer)
{
throw new GkvException($"Klient '{first_cost.Person.LastNameFirstName}' ({addressInfo.IKLeistungserbringer}) und '{customer.Person.LastNameFirstName}' ({addressInfo2.IKLeistungserbringer}) verweisen auf unterschiedliche Leistungserbringer.");
}
}
foreach (var invoicebase in gkvAbrechnung.InvoiceBases)
{
var service = DAOFactory.SearchDAO.GetServiceInvoiceByInvoiceBaseOid(invoicebase.Oid.Value);
var orga2 = invoicebase.CostBearer2SupportConcept.CostBearer.Organisation;
var customer = invoicebase.CostBearer2SupportConcept.SupportConcept.Customer;
var invoicebase_dc = MapperFactory.InvoiceBaseDC_InvoiceBase.MapToNewDC(invoicebase);
var servicedc = MapperFactory.ServiceInvoiceDC_ServiceInvoice.MapToNewDC(service);
var customerdc = MapperFactory.CustomerDC_Customer.MapToNewDC(customer);
Validator.ValidateCustomer(customerdc);
manager.Add(servicedc, orgadc, customerdc, addressInfo, dat_short, tra_short);
}
manager.Apply();
if (manager.DakotaFileDict.Count != 1 || manager.DakotaFileDict.First().Value.GetKostenträgerCount() != 1)
{
var msg = "Unerwartete Anzahl an Dakota Files berechnet.";
throw new GkvException(msg);
}
var file_from_manager = manager.DakotaFileDict.First().Value;
var nutzdatendatei = file_from_manager.GetNutzdatendatei();
// https://dev.mysql.com/doc/refman/8.3/en/string-type-syntax.html
// A TEXT column with a maximum length of 16,777,215 (224 1) characters.
// The effective maximum length is less if the value contains multibyte characters.
// Each MEDIUMTEXT value is stored using a 3-byte length prefix that indicates the number of bytes in the value.
//
// Type | Maximum length
// -----------+-------------------------------------
// TINYTEXT | 255(2^81) bytes
// TEXT | 65,535(2^161) bytes = 64 KiB
// MEDIUMTEXT | 16,777,215(2^241) bytes = 16 MiB
// LONGTEXT | 4,294,967,295(2^321) bytes = 4 GiB
if (nutzdatendatei.Length > 16777215)
{
var msg = $"nutzdatendatei - Länger als 16777215: {nutzdatendatei.Length}";
throw new GkvException(msg);
}
protokoll.Datenaustauschreferenz = datenaustauschreferenz;
protokoll.Transfernummer = transfernummer;
protokoll.IKDatenannahmestelle = file_from_manager.GetIKDatenannahmestelle();
protokoll.IKKostentrager = file_from_manager.GetIKKostenträger();
protokoll.IKLeistungserbringer = file_from_manager.GetIKLeistungserbringer();
protokoll.IKKrankenkasse = file_from_manager.GetIKVersichertenKarte();
protokoll.Rechnungsnummer = file_from_manager.GetRechnungsnummer();
protokoll.Auftragsdatei = file_from_manager.GetAuftragsdatei();
protokoll.Nutzdatendatei = nutzdatendatei;
protokoll.Transfername = file_from_manager.GetTransferName();
protokoll.Dateigrosse = nutzdatendatei.Length;
protokoll.Dateityp = "Nutzdatendatei";
protokoll.Dateiname = protokoll.Transfername;
protokoll.AbsenderBezeichnung = "ownSoft GmbH";
protokoll.EmpfangerBezeichnung = orgadc.BezDatenannahmestelle;
return protokoll;
}
catch (GkvException de)
{
error = de.ToString();
}
catch (Exception e)
{
error = e.ToString();
}
return null;
}
private Tuple<int, int> GetNextDatenaustauschreferenzTransfernummer(GkvAbrechnung gkvAbrechnung, string datenannahmestelle)
{
var datenaustauschref = DAOFactory.SearchDAO.GetNextDatenaustauschreferenz(datenannahmestelle);
int transfernummer;
var state = gkvAbrechnung.GetState();
if (state == GkvState.NoSend)
{
transfernummer = DAOFactory.SearchDAO.GetNextTransfernummer(datenannahmestelle);
}
else if (state == GkvState.ErrorSoft || state == GkvState.ErrorFatal || state == GkvState.ErrorFolgefehler)
{
transfernummer = gkvAbrechnung.GkvTransferProtokolle.Last().Transfernummer;
}
else
{
throw new ArgumentException($"Versucht Transfernummer zu laden, invalid state: {state}", nameof(state));
}
return new Tuple<int, int>(datenaustauschref, transfernummer);
}
private Tuple<int, int> ClearDatenaustauschreferenzTransfernummer(int datenaustauschreferenz, int transfernummer)
{
int d = datenaustauschreferenz % 99999;
int t = transfernummer % 1000;
if (d == 0)
{
d = 99999;
}
return new Tuple<int, int>(d, t);
}
private GkvServerSendNewResponseDC SendApp8SendNewRequest(GkvTransferProtokoll protokoll)
{
var gkv_transfer_dc = MapperFactory.GkvTransferProtokollDC_GkvTransferprotokoll.MapToNewDC(protokoll);
var request_app8 = new GkvServerSendNewRequestDC
{
Protokoll = gkv_transfer_dc
};
var response_app8 = SendApp8Request<GkvServerSendNewRequestDC, GkvServerSendNewResponseDC>(request_app8);
if (!response_app8.Success)
throw new GkvException(response_app8.Message);
return response_app8;
}
/// <summary>
///
/// </summary>
/// <param name="updateables"></param>
/// <param name="loginName"></param>
/// <param name="hashed_password"></param>
/// <returns>Returns true, if the states are all up to date. False otherwise.</returns>
private bool SendApp8GetStatusRequest(GkvAbrechnungDC[] updateables)
{
var updateables_len = updateables.Count();
var request = new GkvServerGetStatusRequestDC
{
Tenant = MultitenancyOperationContextExt.Current.Tenant,
Oids = new long[updateables_len]
};
for (int id = 0; id < updateables_len; id++)
{
var gkv_abrechnung = updateables[id];
var gkv_transfer = gkv_abrechnung.TransferProtokolle.Last();
request.Oids[id] = gkv_transfer.GkvTransferProtokollOid.Value;
}
GkvServerGetStatusResponseDC response_app8;
try
{
response_app8 = SendApp8Request<GkvServerGetStatusRequestDC, GkvServerGetStatusResponseDC>(request);
}
catch (Exception e)
{
MailUtils.SendGkvModuleErrorMail("GkvServerGetStatusRequest Error", e, Tenant);
return true;
}
if (!response_app8.Success)
throw new GkvException("Success false - " + response_app8.Message);
if (response_app8.Results is null)
throw new GkvException("Result null - " + response_app8.Message);
var results = response_app8.Results.Where(x => x is object);
if (!results.Any())
return true;
HandleGkvServerResults(results);
return false;
}
public void HandleGkvServerResults(IEnumerable<GkvServerResultDC> results)
{
var protokolls = new List<GkvTransferProtokoll>();
foreach (var result in results)
{
var protokoll = DAOFactory.GenericDAO.GetByID<GkvTransferProtokoll>(result.ProtokollOid);
protokoll.ResultType = result.ResultType;
protokoll.Fehlertitel = result.Titel;
protokoll.Fehlerdatum = result.Datum;
protokoll.Fehlernachricht = result.Nachricht;
switch (result.ResultType)
{
case GkvTransferResultType.Success:
protokoll.SentDakotaSuccess = true;
break;
case GkvTransferResultType.FailSoft:
protokoll.SentApp8Success = false;
break;
case GkvTransferResultType.FailFatal:
protokoll.SentApp8Success = false;
break;
case GkvTransferResultType.FailFollowUp:
protokoll.SentApp8Success = false;
break;
}
protokolls.Add(protokoll);
}
if (protokolls.Any())
DAOFactory.GenericDAO.Update(protokolls);
var follows = results.Where(x => x.ResultType == GkvTransferResultType.FailFollowUp);
if (follows.Any())
{
foreach (var follow in follows)
{
var protokoll_oid = follow.ProtokollOid;
var protokoll = DAOFactory.GenericDAO.LoadByID<GkvTransferProtokoll>(protokoll_oid);
var abrechnung_oid = protokoll.GkvAbrechnungOid;
var new_req = new GkvAbrechnungSendRequestDC()
{
GkvAbrechnungOid = abrechnung_oid
};
var res = SendNewGkvAbrechnung(new_req);
if (!res.Success)
throw new GkvException("Success - " + res.Message);
}
}
}
private Res SendApp8Request<Req, Res>(Req request) where Req : GkvServerRequestDC where Res : GkvResponseDC
{
var user = LoggedInUserOperationContextExt.Current?.User ?? SessionFacade.LoggedInUser;
if (user == null)
{
throw new GkvException("User unbekannt", "KundenApp");
}
request.Username = user.LoginName;
request.Password = user.BCryptPassword;
request.Tenant = MultitenancyOperationContextExt.Current.Tenant;
if (request is GkvServerSendNewRequestDC send_new_req)
{
send_new_req.ApplicationUserOid = user.Oid.Value;
}
return GkvSender.SendApp8Request<Req, Res>(request, request.Tenant);
}
}
}

View File

@@ -0,0 +1,82 @@
using System;
using System.Collections.Generic;
using System.IdentityModel.Claims;
using System.Linq;
using System.Reflection;
using System.ServiceModel.Channels;
using System.Text;
using System.Threading.Tasks;
using BeWo.Service.ServiceContracts;
using BS.Shared.Attributes;
using BS.Shared.Extensions;
using NHibernate.Hql.Ast.ANTLR.Tree;
namespace BeWo.Service.ServiceUtils
{
public static class ServiceHelper
{
public static T GetCustomAttribute<T>(Uri baseAddress, Uri request) where T : Attribute
{
// Hole Interface
string lInterface = null;
var segments = baseAddress.Segments;
for (int i = 0; i < segments.Length; i++)
{
var seg = segments[i].Trim('/');
if (seg.EndsWith(".svc"))
{
lInterface = seg.Substring(0, seg.Length - 4);
}
}
// Falls kein Interface gefunden wird
if (string.IsNullOrWhiteSpace(lInterface) )
{
throw new ArgumentException($"Zugriff verweigert. Interface unbekannt");
}
// Wird für URLTemplate != Methodname verwendet
var name = $"BeWo.Service.ServiceContracts.I{lInterface}";
var t = Type.GetType(name);
var resolver = new UriTemplateResolver(baseAddress, t);
var method = resolver.ResolveMethod(request.AbsoluteUri);
var methodInfo = t.GetMethod(method);
// Rückgabe
return getCustomAttribute<T>(methodInfo);
}
public static T GetCustomAttribute<T>(string pServiceInterface, string pMethodName) where T : Attribute
{
MethodInfo methodInfo = null;
try
{
// Hole entsprechende Methode
var name = $"BeWo.Service.ServiceContracts.{pServiceInterface}";
var t = Type.GetType(name);
methodInfo = t.GetMethod(pMethodName);
}
catch (Exception)
{
throw new ArgumentException($"Zugriff verweigert. Interface oder Methode unbekannt");
}
return getCustomAttribute<T>(methodInfo);
}
private static T getCustomAttribute<T>(MethodInfo methodInfo) where T : Attribute
{
if (methodInfo == null)
{
throw new ArgumentException($"Zugriff verweigert. Interface oder Methode unbekannt");
}
// Hole Custome Attribute
var attribute = methodInfo.GetCustomAttribute<T>();
return attribute;
}
}
}

View File

@@ -0,0 +1,46 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.ServiceModel.Web;
using System.Text;
using System.Threading.Tasks;
namespace BeWo.Service.ServiceUtils
{
public class UriTemplateResolver
{
private UriTemplateTable _uriTemplateTable;
public UriTemplateResolver(Uri baseAddress, Type serviceType)
{
_uriTemplateTable = new UriTemplateTable(baseAddress);
foreach (var method in serviceType.GetMethods())
{
var webGet = method.GetCustomAttribute<WebGetAttribute>();
var webInvoke = method.GetCustomAttribute<WebInvokeAttribute>();
if (webGet != null)
{
_uriTemplateTable.KeyValuePairs.Add(new KeyValuePair<UriTemplate, object>(
new UriTemplate(webGet.UriTemplate), method.Name));
}
else if (webInvoke != null)
{
_uriTemplateTable.KeyValuePairs.Add(new KeyValuePair<UriTemplate, object>(
new UriTemplate(webInvoke.UriTemplate), method.Name));
}
}
_uriTemplateTable.MakeReadOnly(false);
}
public string ResolveMethod(string requestUri)
{
var match = _uriTemplateTable.MatchSingle(new Uri(requestUri));
return match?.Data as string;
}
}
}

View File

@@ -38,13 +38,14 @@ namespace BS.Shared.AppSender
}
}
public static Res Send<Req, Res>(Req request, string url, string tenant) where Req : AppRequestDC where Res : AppResponseDC
public static Res Send<Req, Res>(Req request, string url, string tenant = null) where Req : AppRequestDC where Res : AppResponseDC
{
request.Tenant = tenant;
if (tenant != null)
request.Tenant = tenant;
var data = JsonConvert.SerializeObject(request);
var response_app8_str = Send(url, data, tenant);
var response_app8_str = Send(url, data, request.Tenant);
if (string.IsNullOrEmpty(response_app8_str))
return null;
@@ -101,7 +102,7 @@ namespace BS.Shared.AppSender
response = await client.UploadStringTaskAsync(url, "POST", dataString);
}
return response;
}
}

View File

@@ -0,0 +1,17 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace BS.Shared.Attributes
{
[AttributeUsage(AttributeTargets.Method, Inherited = true)]
public class RequireNoTenantAttribute : Attribute
{
public RequireNoTenantAttribute()
{
}
}
}

View File

@@ -0,0 +1,47 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace BS.Shared.Attributes
{
[AttributeUsage(AttributeTargets.Method, Inherited = true)]
public class RequirePermissionAttribute : Attribute
{
public UserRightType[] Permissions { get; }
public RequirePermissionAttribute(params UserRightType[] permissions)
{
Permissions = permissions;
}
public bool HasPermission(IEnumerable<UserRightType> rights)
{
if (Permissions is null || Permissions.Length == 0)
return true;
foreach (var right in rights)
{
if (HasPermission(right))
return true;
}
return false;
}
public bool HasPermission(UserRightType right)
{
if (Permissions is null || Permissions.Length == 0)
return true;
for (var i = 0; i < Permissions.Length; i++)
{
var permission = Permissions[i];
if (right == permission) return true;
}
return false;
}
}
}

View File

@@ -1317,4 +1317,10 @@ namespace BS.Shared
EmployeeMonthlySignature,
BargeldkasseneinzahlungsSignature
}
public enum GkvRawDataType
{
Auftragsdatei,
Nutzdatendatei
}
}

View File

@@ -1160,6 +1160,11 @@ namespace BS.Shared.Core
return age;
}
public static bool TryParseISO8601(string iso8601String, out DateTime date)
{
return DateTime.TryParse(iso8601String, out date);
}
}
public struct NullCompareResult

View File

@@ -0,0 +1,20 @@
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;
namespace BS.Shared.DataContracts.AdminService
{
[DataContract]
public class AdminServiceSumReqDC : IAdminServiceDC
{
[DataMember(Name = "end", IsRequired = true)]
public string End { get; set; }
[DataMember(Name = "start", IsRequired = true)]
public string Start { get; set; }
}
}

View File

@@ -0,0 +1,12 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace BS.Shared.DataContracts.AdminService
{
public interface IAdminServiceDC : IDataContract
{
}
}

View File

@@ -16,7 +16,7 @@ namespace BS.Shared.DataContracts.GkvAbrechnung
}
[JsonProperty("gkvinvoices")]
[DataMember] public CompactGkvAbrechnungDC[] CompactGkvAbrechnungen { get; set; }
[JsonProperty("sum")]
[DataMember] public decimal Sum { get; set; }
}
}

View File

@@ -133,6 +133,8 @@
</ItemGroup>
<ItemGroup>
<Compile Include="AppSender\GkvSender.cs" />
<Compile Include="Attributes\RequireNoTenantAttribute.cs" />
<Compile Include="Attributes\RequirePermissionAttribute.cs" />
<Compile Include="BeWoEntityEnums.cs" />
<Compile Include="Core\AppSettingReader.cs" />
<Compile Include="Core\ComplexWohnheimbuchungsRelationHelper.cs" />
@@ -168,6 +170,8 @@
<Compile Include="Core\ValidatorExtended.cs" />
<Compile Include="Core\WohnheimbuchungsIntervall.cs" />
<Compile Include="DataContracts\AbsenceOverviewFilterDC.cs" />
<Compile Include="DataContracts\AdminService\IAdminServiceDC.cs" />
<Compile Include="DataContracts\AdminService\AdminServiceSumReqDC.cs" />
<Compile Include="DataContracts\AiSettingsDC.cs" />
<Compile Include="DataContracts\AiChatDC.cs" />
<Compile Include="DataContracts\AbwesenheitsInformationDC.cs" />
@@ -539,6 +543,7 @@
<ItemGroup>
<None Include="packages.config" />
</ItemGroup>
<ItemGroup />
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.

View File

@@ -0,0 +1,60 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.35229.62
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KTDReaderGUI", "KTDReaderGUI\KTDReaderGUI.csproj", "{F8EE2279-EDEA-4D4A-9D0F-89B7DA7E6AC2}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Dakota", "..\..\Dakota\Dakota.csproj", "{47331732-DD96-4075-869F-83AA9F3F9937}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BeWo.Styles", "..\..\BeWo.Styles\BeWo.Styles.csproj", "{9BAB16DE-E284-4B57-BD09-763FC5CE521A}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Shared", "..\..\Shared\Shared.csproj", "{2F50B83D-A3F0-4EC4-979A-3F9B7E3D8ED4}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Controls", "..\..\Controls\Controls.csproj", "{D5E53B0F-BF5A-41E8-93E2-0F32845FC729}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
DebugRemote|Any CPU = DebugRemote|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{F8EE2279-EDEA-4D4A-9D0F-89B7DA7E6AC2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{F8EE2279-EDEA-4D4A-9D0F-89B7DA7E6AC2}.Debug|Any CPU.Build.0 = Debug|Any CPU
{F8EE2279-EDEA-4D4A-9D0F-89B7DA7E6AC2}.DebugRemote|Any CPU.ActiveCfg = Debug|Any CPU
{F8EE2279-EDEA-4D4A-9D0F-89B7DA7E6AC2}.DebugRemote|Any CPU.Build.0 = Debug|Any CPU
{F8EE2279-EDEA-4D4A-9D0F-89B7DA7E6AC2}.Release|Any CPU.ActiveCfg = Release|Any CPU
{F8EE2279-EDEA-4D4A-9D0F-89B7DA7E6AC2}.Release|Any CPU.Build.0 = Release|Any CPU
{47331732-DD96-4075-869F-83AA9F3F9937}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{47331732-DD96-4075-869F-83AA9F3F9937}.Debug|Any CPU.Build.0 = Debug|Any CPU
{47331732-DD96-4075-869F-83AA9F3F9937}.DebugRemote|Any CPU.ActiveCfg = Debug|Any CPU
{47331732-DD96-4075-869F-83AA9F3F9937}.DebugRemote|Any CPU.Build.0 = Debug|Any CPU
{47331732-DD96-4075-869F-83AA9F3F9937}.Release|Any CPU.ActiveCfg = Release|Any CPU
{47331732-DD96-4075-869F-83AA9F3F9937}.Release|Any CPU.Build.0 = Release|Any CPU
{9BAB16DE-E284-4B57-BD09-763FC5CE521A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9BAB16DE-E284-4B57-BD09-763FC5CE521A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9BAB16DE-E284-4B57-BD09-763FC5CE521A}.DebugRemote|Any CPU.ActiveCfg = Debug|Any CPU
{9BAB16DE-E284-4B57-BD09-763FC5CE521A}.DebugRemote|Any CPU.Build.0 = Debug|Any CPU
{9BAB16DE-E284-4B57-BD09-763FC5CE521A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9BAB16DE-E284-4B57-BD09-763FC5CE521A}.Release|Any CPU.Build.0 = Release|Any CPU
{2F50B83D-A3F0-4EC4-979A-3F9B7E3D8ED4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{2F50B83D-A3F0-4EC4-979A-3F9B7E3D8ED4}.Debug|Any CPU.Build.0 = Debug|Any CPU
{2F50B83D-A3F0-4EC4-979A-3F9B7E3D8ED4}.DebugRemote|Any CPU.ActiveCfg = DebugRemote|Any CPU
{2F50B83D-A3F0-4EC4-979A-3F9B7E3D8ED4}.DebugRemote|Any CPU.Build.0 = DebugRemote|Any CPU
{2F50B83D-A3F0-4EC4-979A-3F9B7E3D8ED4}.Release|Any CPU.ActiveCfg = Release|Any CPU
{2F50B83D-A3F0-4EC4-979A-3F9B7E3D8ED4}.Release|Any CPU.Build.0 = Release|Any CPU
{D5E53B0F-BF5A-41E8-93E2-0F32845FC729}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D5E53B0F-BF5A-41E8-93E2-0F32845FC729}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D5E53B0F-BF5A-41E8-93E2-0F32845FC729}.DebugRemote|Any CPU.ActiveCfg = DebugRemote|Any CPU
{D5E53B0F-BF5A-41E8-93E2-0F32845FC729}.DebugRemote|Any CPU.Build.0 = DebugRemote|Any CPU
{D5E53B0F-BF5A-41E8-93E2-0F32845FC729}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D5E53B0F-BF5A-41E8-93E2-0F32845FC729}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {BDED1672-9A6A-498D-99CE-41528F6BA939}
EndGlobalSection
EndGlobal

View File

@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8" />
</startup>
<appSettings>
<add key="GkvKostentragerdateiFolderPath" value="C:\GkvAbrechnung\KTDatei\" />
</appSettings>
</configuration>

View File

@@ -0,0 +1,8 @@
<Application
x:Class="KTDReaderGUI.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:KTDReaderGUI"
StartupUri="MainWindow.xaml">
<Application.Resources />
</Application>

View File

@@ -0,0 +1,17 @@
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Threading.Tasks;
using System.Windows;
namespace KTDReaderGUI
{
/// <summary>
/// Interaktionslogik für "App.xaml"
/// </summary>
public partial class App : Application
{
}
}

View File

@@ -0,0 +1,117 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{F8EE2279-EDEA-4D4A-9D0F-89B7DA7E6AC2}</ProjectGuid>
<OutputType>WinExe</OutputType>
<RootNamespace>KTDReaderGUI</RootNamespace>
<AssemblyName>KTDReaderGUI</AssemblyName>
<TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
<WarningLevel>4</WarningLevel>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
<Deterministic>true</Deterministic>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Configuration" />
<Reference Include="System.Data" />
<Reference Include="System.Xml" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Xaml">
<RequiredTargetFramework>4.0</RequiredTargetFramework>
</Reference>
<Reference Include="WindowsBase" />
<Reference Include="PresentationCore" />
<Reference Include="PresentationFramework" />
</ItemGroup>
<ItemGroup>
<ApplicationDefinition Include="App.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</ApplicationDefinition>
<Page Include="MainWindow.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Compile Include="App.xaml.cs">
<DependentUpon>App.xaml</DependentUpon>
<SubType>Code</SubType>
</Compile>
<Compile Include="MainWindow.xaml.cs">
<DependentUpon>MainWindow.xaml</DependentUpon>
<SubType>Code</SubType>
</Compile>
</ItemGroup>
<ItemGroup>
<Compile Include="Properties\AssemblyInfo.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="Properties\Resources.Designer.cs">
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
<Compile Include="Properties\Settings.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Settings.settings</DependentUpon>
<DesignTimeSharedInput>True</DesignTimeSharedInput>
</Compile>
<EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
</EmbeddedResource>
<None Include="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
</None>
</ItemGroup>
<ItemGroup>
<None Include="App.config" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\..\BeWo.Styles\BeWo.Styles.csproj">
<Project>{9bab16de-e284-4b57-bd09-763fc5ce521a}</Project>
<Name>BeWo.Styles</Name>
</ProjectReference>
<ProjectReference Include="..\..\..\Controls\Controls.csproj">
<Project>{d5e53b0f-bf5a-41e8-93e2-0f32845fc729}</Project>
<Name>Controls</Name>
</ProjectReference>
<ProjectReference Include="..\..\..\Dakota\Dakota.csproj">
<Project>{47331732-DD96-4075-869F-83AA9F3F9937}</Project>
<Name>Dakota</Name>
</ProjectReference>
<ProjectReference Include="..\..\..\Shared\Shared.csproj">
<Project>{2f50b83d-a3f0-4ec4-979a-3f9b7e3d8ed4}</Project>
<Name>Shared</Name>
</ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>

View File

@@ -0,0 +1,106 @@
<Window
x:Class="KTDReaderGUI.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:KTDReaderGUI"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
Title="Kostenträgerdatei Reader GUI"
Width="500"
Height="400"
Background="{DynamicResource ApplicationBackground}"
mc:Ignorable="d">
<Window.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<!-- Common base theme -->
<ResourceDictionary Source="pack://application:,,,/BeWo.Styles;component/ModernOrangeBlack.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Window.Resources>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Grid Grid.Column="1" Margin="10">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto" />
<ColumnDefinition Width="10" />
<ColumnDefinition Width="auto" MinWidth="200" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="auto" />
<RowDefinition Height="auto" />
<RowDefinition Height="auto" />
<RowDefinition Height="auto" />
<RowDefinition Height="auto" />
<RowDefinition Height="auto" />
<RowDefinition Height="auto" />
<RowDefinition Height="auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Label
Grid.Row="0"
Grid.Column="0"
IsEnabled="False">
Kostenträger Path
</Label>
<TextBox
x:Name="input_file"
Grid.Row="0"
Grid.Column="2" />
<Label Grid.Row="1" Grid.Column="0">IK Krankenkasse</Label>
<TextBox
x:Name="input_krankenkasse"
Grid.Row="1"
Grid.Column="2" />
<Label Grid.Row="2" Grid.Column="0">Leistungserbringergruppe</Label>
<TextBox
x:Name="input_leistungsgruppe"
Grid.Row="2"
Grid.Column="2" />
<Button
Grid.Row="3"
Grid.ColumnSpan="3"
Width="100"
HorizontalAlignment="Center"
Click="Button_Click">
Ermitteln
</Button>
<Label Grid.Row="4" Grid.Column="0">IK Krankenkasse</Label>
<TextBox
x:Name="out_ikkrankenkasse"
Grid.Row="4"
Grid.Column="2"
IsEnabled="False" />
<Label Grid.Row="5" Grid.Column="0">IK Kostenträger</Label>
<TextBox
x:Name="out_ikkostentrager"
Grid.Row="5"
Grid.Column="2"
IsEnabled="False" />
<Label Grid.Row="6" Grid.Column="0">IK Datenannahmestelle</Label>
<TextBox
x:Name="out_ikdatenannahmestelle"
Grid.Row="6"
Grid.Column="2"
IsEnabled="False" />
<Label Grid.Row="7" Grid.Column="0">Bez Datenannahmestelle</Label>
<TextBox
x:Name="out_bezdatenannahmestelle"
Grid.Row="7"
Grid.Column="2"
IsEnabled="False" />
</Grid>
</Grid>
</Window>

View File

@@ -0,0 +1,95 @@
using Dakota.Logic;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace KTDReaderGUI
{
/// <summary>
/// Interaktionslogik für MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
private string KostentragerdateiFolderPath { get; set; } = ConfigurationManager.AppSettings.Get("GkvKostentragerdateiFolderPath");
private DakotaKTDReader Reader;
public MainWindow()
{
InitializeComponent();
try
{
load();
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
private void load()
{
var path = KostentragerdateiFolderPath;
if (string.IsNullOrEmpty(path))
{
var root = Directory.GetCurrentDirectory();
path = System.IO.Path.Combine(root, "KTDatei");
}
input_file.Text = path;
Reader = new DakotaKTDReader(path);
}
private void Button_Click(object sender, RoutedEventArgs e)
{
try
{
calc();
}
catch(Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
private void calc()
{
var ikkrankenkasse = input_krankenkasse.Text;
var leistungsgruppe = input_leistungsgruppe.Text;
if (ikkrankenkasse.Length != 9 || leistungsgruppe.Length != 7)
return;
var rtn = Reader.Resolve(ikkrankenkasse, leistungsgruppe.Substring(0, 2), leistungsgruppe.Substring(2, 5));
if (rtn is null)
{
MessageBox.Show("Eingabe konnte nicht gefunden werden.");
}
else
{
out_ikkrankenkasse.Text = rtn.Item3;
out_ikkostentrager.Text = rtn.Item2;
out_ikdatenannahmestelle.Text = rtn.Item1;
out_bezdatenannahmestelle.Text = rtn.Item4;
}
}
}
}

View File

@@ -0,0 +1,55 @@
using System.Reflection;
using System.Resources;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Windows;
// Allgemeine Informationen über eine Assembly werden über die folgenden
// Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern,
// die einer Assembly zugeordnet sind.
[assembly: AssemblyTitle("KTDReaderGUI")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("KTDReaderGUI")]
[assembly: AssemblyCopyright("Copyright © 2025")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Durch Festlegen von ComVisible auf FALSE werden die Typen in dieser Assembly
// für COM-Komponenten unsichtbar. Wenn Sie auf einen Typ in dieser Assembly von
// COM aus zugreifen müssen, sollten Sie das ComVisible-Attribut für diesen Typ auf "True" festlegen.
[assembly: ComVisible(false)]
//Um mit dem Erstellen lokalisierbarer Anwendungen zu beginnen, legen Sie
//<UICulture>ImCodeVerwendeteKultur</UICulture> in der .csproj-Datei
//in einer <PropertyGroup> fest. Wenn Sie in den Quelldateien beispielsweise Deutsch
//(Deutschland) verwenden, legen Sie <UICulture> auf \"de-DE\" fest. Heben Sie dann die Auskommentierung
//des nachstehenden NeutralResourceLanguage-Attributs auf. Aktualisieren Sie "en-US" in der nachstehenden Zeile,
//sodass es mit der UICulture-Einstellung in der Projektdatei übereinstimmt.
//[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)]
[assembly: ThemeInfo(
ResourceDictionaryLocation.None, //Speicherort der designspezifischen Ressourcenwörterbücher
//(wird verwendet, wenn eine Ressource auf der Seite nicht gefunden wird,
// oder in den Anwendungsressourcen-Wörterbüchern nicht gefunden werden kann.)
ResourceDictionaryLocation.SourceAssembly //Speicherort des generischen Ressourcenwörterbuchs
//(wird verwendet, wenn eine Ressource auf der Seite nicht gefunden wird,
// designspezifischen Ressourcenwörterbuch nicht gefunden werden kann.)
)]
// Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten:
//
// Hauptversion
// Nebenversion
// Buildnummer
// Revision
//
// Sie können alle Werte angeben oder Standardwerte für die Build- und Revisionsnummern verwenden,
// indem Sie "*" wie unten gezeigt eingeben:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

View File

@@ -0,0 +1,70 @@
//------------------------------------------------------------------------------
// <auto-generated>
// Dieser Code wurde von einem Tool generiert.
// Laufzeitversion: 4.0.30319.42000
//
// Änderungen an dieser Datei können fehlerhaftes Verhalten verursachen und gehen verloren, wenn
// der Code erneut generiert wird.
// </auto-generated>
//------------------------------------------------------------------------------
namespace KTDReaderGUI.Properties
{
/// <summary>
/// Eine stark typisierte Ressourcenklasse zum Suchen von lokalisierten Zeichenfolgen usw.
/// </summary>
// Diese Klasse wurde von der StronglyTypedResourceBuilder-Klasse
// über ein Tool wie ResGen oder Visual Studio automatisch generiert.
// Um einen Member hinzuzufügen oder zu entfernen, bearbeiten Sie die .ResX-Datei und führen dann ResGen
// mit der Option /str erneut aus, oder erstellen Sie Ihr VS-Projekt neu.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources
{
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resources()
{
}
/// <summary>
/// Gibt die zwischengespeicherte ResourceManager-Instanz zurück, die von dieser Klasse verwendet wird.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager
{
get
{
if ((resourceMan == null))
{
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("KTDReaderGUI.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// Überschreibt die CurrentUICulture-Eigenschaft des aktuellen Threads für alle
/// Ressourcenlookups, die diese stark typisierte Ressourcenklasse verwenden.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture
{
get
{
return resourceCulture;
}
set
{
resourceCulture = value;
}
}
}
}

View File

@@ -0,0 +1,117 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@@ -0,0 +1,29 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace KTDReaderGUI.Properties
{
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase
{
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
public static Settings Default
{
get
{
return defaultInstance;
}
}
}
}

View File

@@ -0,0 +1,7 @@
<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="uri:settings" CurrentProfile="(Default)">
<Profiles>
<Profile Name="(Default)" />
</Profiles>
<Settings />
</SettingsFile>