GetStatus FailFollowUpLogic

Zusätzliche Exception Handling
Test Tenant
This commit is contained in:
2024-11-05 09:52:36 +01:00
parent ea08476354
commit 8b6f9e9630
12 changed files with 507 additions and 215 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

View File

@@ -1,12 +1,16 @@
<localView:BeWoView x:Class="BeWo.View.Detail.MandatorView" <localView:BeWoView
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" x:Class="BeWo.View.Detail.MandatorView"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:localView="clr-namespace:BeWo.View" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:dxe="http://schemas.devexpress.com/winfx/2008/xaml/editors" xmlns:dxe="http://schemas.devexpress.com/winfx/2008/xaml/editors"
xmlns:markup="clr-namespace:BeWo.MultiLanguage.Markup" xmlns:dxg="http://schemas.devexpress.com/winfx/2008/xaml/grid"
xmlns:dxg="http://schemas.devexpress.com/winfx/2008/xaml/grid" xmlns:localView="clr-namespace:BeWo.View"
Height="Auto" Width="Auto" HorizontalAlignment="Stretch" xmlns:markup="clr-namespace:BeWo.MultiLanguage.Markup"
VerticalAlignment="Stretch" Focusable="True"> Width="Auto"
Height="Auto"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
Focusable="True">
<Grid x:Name="root"> <Grid x:Name="root">
<Grid.RowDefinitions> <Grid.RowDefinitions>
<RowDefinition Height="Auto" /> <RowDefinition Height="Auto" />
@@ -24,13 +28,40 @@
<ColumnDefinition Width="*" MaxWidth="420" /> <ColumnDefinition Width="*" MaxWidth="420" />
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
<Label Grid.Column="0" Grid.Row="0" Margin="3" VerticalAlignment="Center">Name</Label> <Label
<TextBox Grid.Column="1" Grid.Row="0" Margin="3" Height="23" Text="{Binding Path=Name, UpdateSourceTrigger=PropertyChanged}" /> Grid.Row="0"
Grid.Column="0"
Margin="3"
VerticalAlignment="Center">
Name
</Label>
<TextBox
Grid.Row="0"
Grid.Column="1"
Height="23"
Margin="3"
Text="{Binding Path=Name, UpdateSourceTrigger=PropertyChanged}" />
<Label Grid.Column="0" Grid.Row="1" Margin="3" VerticalAlignment="Center">IK Nummer (Leistungserbringer)</Label> <Label
<TextBox Grid.Column="1" Grid.Row="1" Margin="3" Height="23" Text="{Binding Path=IKLeistungserbringer, UpdateSourceTrigger=PropertyChanged}" /> Grid.Row="1"
Grid.Column="0"
Margin="3"
VerticalAlignment="Center">
IK Nummer (Leistungserbringer)
</Label>
<TextBox
Grid.Row="1"
Grid.Column="1"
Height="23"
Margin="3"
Text="{Binding Path=IKLeistungserbringer, UpdateSourceTrigger=PropertyChanged}" />
<GroupBox Margin="3 20 3 3" Grid.Row="2" Grid.ColumnSpan="2" Header="Adresse" Style="{StaticResource ObjectEditGroupBox}"> <GroupBox
Grid.Row="2"
Grid.ColumnSpan="2"
Margin="3,20,3,3"
Header="Adresse"
Style="{StaticResource ObjectEditGroupBox}">
<Grid> <Grid>
<Grid.RowDefinitions> <Grid.RowDefinitions>
<RowDefinition Height="Auto" /> <RowDefinition Height="Auto" />
@@ -42,18 +73,56 @@
<ColumnDefinition Width="150" /> <ColumnDefinition Width="150" />
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
<Label Grid.Column="0" Grid.Row="0" Margin="3" VerticalAlignment="Center">Strasse</Label> <Label
<Label Grid.Column="0" Grid.Row="1" Margin="3" VerticalAlignment="Center">Postleitzahl</Label> Grid.Row="0"
<Label Grid.Column="0" Grid.Row="2" Margin="3" VerticalAlignment="Center">Ort</Label> Grid.Column="0"
Margin="3"
VerticalAlignment="Center">
Strasse
</Label>
<Label
Grid.Row="1"
Grid.Column="0"
Margin="3"
VerticalAlignment="Center">
Postleitzahl
</Label>
<Label
Grid.Row="2"
Grid.Column="0"
Margin="3"
VerticalAlignment="Center">
Ort
</Label>
<TextBox Grid.Column="1" Grid.Row="0" Margin="3" Height="23" Text="{Binding Path=Street, UpdateSourceTrigger=PropertyChanged}" /> <TextBox
<TextBox Grid.Column="1" Grid.Row="1" Margin="3" Height="23" Text="{Binding Path=PostalCode, UpdateSourceTrigger=PropertyChanged}" /> Grid.Row="0"
<TextBox Grid.Column="1" Grid.Row="2" Margin="3" Height="23" Text="{Binding Path=Town, UpdateSourceTrigger=PropertyChanged}" /> Grid.Column="1"
Height="23"
Margin="3"
Text="{Binding Path=Street, UpdateSourceTrigger=PropertyChanged}" />
<TextBox
Grid.Row="1"
Grid.Column="1"
Height="23"
Margin="3"
Text="{Binding Path=PostalCode, UpdateSourceTrigger=PropertyChanged}" />
<TextBox
Grid.Row="2"
Grid.Column="1"
Height="23"
Margin="3"
Text="{Binding Path=Town, UpdateSourceTrigger=PropertyChanged}" />
</Grid> </Grid>
</GroupBox> </GroupBox>
<GroupBox Margin="3 20 3 3" Grid.Row="3" Grid.ColumnSpan="2" Header="Einstellungen" Style="{StaticResource ObjectEditGroupBox}"> <GroupBox
Grid.Row="3"
Grid.ColumnSpan="2"
Margin="3,20,3,3"
Header="Einstellungen"
Style="{StaticResource ObjectEditGroupBox}">
<Grid x:Name="EinstellungenGrid"> <Grid x:Name="EinstellungenGrid">
<Grid.RowDefinitions> <Grid.RowDefinitions>
<RowDefinition Height="Auto" /> <RowDefinition Height="Auto" />
@@ -72,31 +141,82 @@
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
<TextBlock Foreground="Black" Grid.Column="0" Grid.Row="3" Margin="3,5,3,5" TextWrapping="Wrap" VerticalAlignment="Center"> <TextBlock
Zeit in Minuten bis der BeWoPlaner nach Inaktivität gesperrt wird Grid.Row="3"
Grid.Column="0"
Margin="3,5,3,5"
VerticalAlignment="Center"
Foreground="Black"
TextWrapping="Wrap">
Zeit in Minuten bis der BeWoPlaner nach Inaktivität gesperrt wird
</TextBlock> </TextBlock>
<dxe:SpinEdit x:Name="LockUITimeSpinEdit" IsFloatValue="False" MinValue="0" MaxValue="999" <dxe:SpinEdit
Grid.Column="1" Grid.Row="3" Margin="3,5,3,5" Height="23" x:Name="LockUITimeSpinEdit"
EditValue="{Binding Path=TimeUntilUILock, Converter={StaticResource Int2DecimalConverter}, Mode=TwoWay}" /> Grid.Row="3"
Grid.Column="1"
Height="23"
Margin="3,5,3,5"
EditValue="{Binding Path=TimeUntilUILock, Converter={StaticResource Int2DecimalConverter}, Mode=TwoWay}"
IsFloatValue="False"
MaxValue="999"
MinValue="0" />
<TextBlock Foreground="Black" Grid.Column="0" Grid.Row="4" Margin="3,5,3,5" TextWrapping="Wrap" VerticalAlignment="Center"> <TextBlock
Grid.Row="4"
Grid.Column="0"
Margin="3,5,3,5"
VerticalAlignment="Center"
Foreground="Black"
TextWrapping="Wrap">
Zeit in Minuten bis die Session in der Mobilversion abläuft Zeit in Minuten bis die Session in der Mobilversion abläuft
</TextBlock> </TextBlock>
<dxe:SpinEdit x:Name="MoKSessionTimeoutSpinEdit" IsFloatValue="False" MinValue="20" MaxValue="60" <dxe:SpinEdit
Grid.Column="1" Grid.Row="4" Margin="3,5,3,5" Height="23" x:Name="MoKSessionTimeoutSpinEdit"
EditValue="{Binding Path=MoKSessionTimeout, Converter={StaticResource Int2DecimalConverter}, Mode=TwoWay}" /> Grid.Row="4"
Grid.Column="1"
Height="23"
Margin="3,5,3,5"
EditValue="{Binding Path=MoKSessionTimeout, Converter={StaticResource Int2DecimalConverter}, Mode=TwoWay}"
IsFloatValue="False"
MaxValue="60"
MinValue="20" />
<TextBlock Foreground="Black" Grid.Column="0" Grid.Row="5" Margin="3,5,3,5" TextWrapping="Wrap" VerticalAlignment="Center" Text="{markup:Translate Anzahl Monate\, ab der eine Warnung für auslaufende Hilfepläne angezeigt wird}"/> <TextBlock
<dxe:SpinEdit x:Name="helpplan" IsFloatValue="False" MinValue="0" MaxValue="999" Grid.Row="5"
Grid.Column="1" Grid.Row="5" Margin="3,5,3,5" Height="23" EditValue="{Binding Path=HilfeplanAuslaufAuswahl, Converter={StaticResource Int2DecimalConverter}}" /> Grid.Column="0"
Margin="3,5,3,5"
VerticalAlignment="Center"
Foreground="Black"
Text="{markup:Translate Anzahl Monate\, ab der eine Warnung für auslaufende Hilfepläne angezeigt wird}"
TextWrapping="Wrap" />
<dxe:SpinEdit
x:Name="helpplan"
Grid.Row="5"
Grid.Column="1"
Height="23"
Margin="3,5,3,5"
EditValue="{Binding Path=HilfeplanAuslaufAuswahl, Converter={StaticResource Int2DecimalConverter}}"
IsFloatValue="False"
MaxValue="999"
MinValue="0" />
<CheckBox Margin="3,5,3,5" Content="Passwortsicherheit aktivieren" IsChecked="{Binding Path=IsPasswordSecurityActiv}" Grid.ColumnSpan="2" Grid.Row="7" /> <CheckBox
Grid.Row="7"
Grid.ColumnSpan="2"
Margin="3,5,3,5"
Content="Passwortsicherheit aktivieren"
IsChecked="{Binding Path=IsPasswordSecurityActiv}" />
</Grid> </Grid>
</GroupBox> </GroupBox>
<GroupBox Margin="3 20 3 3" Grid.Row="4" Grid.ColumnSpan="2" Header="{markup:Translate Zeiterfassung}" Style="{StaticResource ObjectEditGroupBox}"> <GroupBox
Grid.Row="4"
Grid.ColumnSpan="2"
Margin="3,20,3,3"
Header="{markup:Translate Zeiterfassung}"
Style="{StaticResource ObjectEditGroupBox}">
<Grid> <Grid>
<Grid.RowDefinitions> <Grid.RowDefinitions>
<RowDefinition Height="Auto" /> <RowDefinition Height="Auto" />
@@ -116,40 +236,149 @@
<ColumnDefinition Width="50" /> <ColumnDefinition Width="50" />
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
<CheckBox Grid.Row="0" Margin="3,5,3,5" Content="{markup:Translate Dokumentationstext in der Zeiterfassung Pflichtfeld}" IsChecked="{Binding Path=IsServiceRecordNoticeMandatory}" Grid.ColumnSpan="2"></CheckBox> <CheckBox
Grid.Row="0"
Grid.ColumnSpan="2"
Margin="3,5,3,5"
Content="{markup:Translate Dokumentationstext in der Zeiterfassung Pflichtfeld}"
IsChecked="{Binding Path=IsServiceRecordNoticeMandatory}" />
<TextBlock Foreground="Black" Grid.Column="0" Grid.Row="1" Margin="3,5,3,5" TextWrapping="Wrap" VerticalAlignment="Center" Text="{markup:Translate Anzahl Tage des Folgemonats\, nach denen die Zeiterfassungseinträge des vergangenen Monats nicht mehr verändert werden oder neue Zeiterfassungseinträge angelegt werden dürfen (0 für unbegrenzt).}"/> <TextBlock
<dxe:SpinEdit IsFloatValue="False" MinValue="0" Grid.Column="1" Grid.Row="1" Margin="3,5,3,5" Height="23" EditValue="{Binding Path=MaxDaysEditServiceRecordsAllowed, Converter={StaticResource Int2DecimalConverter}}" /> Grid.Row="1"
Grid.Column="0"
Margin="3,5,3,5"
VerticalAlignment="Center"
Foreground="Black"
Text="{markup:Translate Anzahl Tage des Folgemonats\, nach denen die Zeiterfassungseinträge des vergangenen Monats nicht mehr verändert werden oder neue Zeiterfassungseinträge angelegt werden dürfen (0 für unbegrenzt).}"
TextWrapping="Wrap" />
<dxe:SpinEdit
Grid.Row="1"
Grid.Column="1"
Height="23"
Margin="3,5,3,5"
EditValue="{Binding Path=MaxDaysEditServiceRecordsAllowed, Converter={StaticResource Int2DecimalConverter}}"
IsFloatValue="False"
MinValue="0" />
<TextBlock Foreground="Black" Grid.Column="0" Grid.Row="2" Margin="3,5,3,5" TextWrapping="Wrap" VerticalAlignment="Center" Text="{markup:Translate Anzahl Tage\, in der die Zeiterfassung erfolgen muss (0 für unbegrenzt)}"/> <TextBlock
<TextBlock Foreground="Black" Grid.Column="0" Grid.Row="3" Margin="3,5,3,5" TextWrapping="Wrap" VerticalAlignment="Center" Text="{markup:Translate Schwellwert in %\, ab der das Restbudget in der Zeiterfassung rot markiert wird}"/> Grid.Row="2"
Grid.Column="0"
Margin="3,5,3,5"
VerticalAlignment="Center"
Foreground="Black"
Text="{markup:Translate Anzahl Tage\, in der die Zeiterfassung erfolgen muss (0 für unbegrenzt)}"
TextWrapping="Wrap" />
<TextBlock
Grid.Row="3"
Grid.Column="0"
Margin="3,5,3,5"
VerticalAlignment="Center"
Foreground="Black"
Text="{markup:Translate Schwellwert in %\, ab der das Restbudget in der Zeiterfassung rot markiert wird}"
TextWrapping="Wrap" />
<dxe:SpinEdit x:Name="AnzTageZeiterfassErfolgt" IsFloatValue="False" MinValue="0" MaxValue="999" <dxe:SpinEdit
Grid.Column="1" Grid.Row="2" Margin="3,5,3,5" Height="23" EditValue="{Binding Path=AnzTageZeiterfassErfolgt, Converter={StaticResource Int2DecimalConverter}}" /> x:Name="AnzTageZeiterfassErfolgt"
Grid.Row="2"
Grid.Column="1"
Height="23"
Margin="3,5,3,5"
EditValue="{Binding Path=AnzTageZeiterfassErfolgt, Converter={StaticResource Int2DecimalConverter}}"
IsFloatValue="False"
MaxValue="999"
MinValue="0" />
<dxe:SpinEdit x:Name="ZeiterfassungsSchwellwert" IsFloatValue="False" MinValue="0" MaxValue="100" Value="80" <dxe:SpinEdit
Grid.Column="1" Grid.Row="3" Margin="3,5,3,5" Height="23" EditValue="{Binding Path=ZeiterfassungsSchwellwert, Converter={StaticResource Int2DecimalConverter}}" /> x:Name="ZeiterfassungsSchwellwert"
Grid.Row="3"
Grid.Column="1"
Height="23"
Margin="3,5,3,5"
EditValue="{Binding Path=ZeiterfassungsSchwellwert, Converter={StaticResource Int2DecimalConverter}}"
IsFloatValue="False"
MaxValue="100"
MinValue="0"
Value="80" />
<TextBlock Foreground="Black" Grid.Column="0" Grid.Row="4" Margin="3,5,3,5" TextWrapping="Wrap" VerticalAlignment="Center" Text="{markup:Translate Zeiteinheit der Dauer}"/> <TextBlock
<ComboBox x:Name="ComboZeiteinheit" Grid.Row="4" Grid.Column="0" Grid.ColumnSpan="2" Margin="160,5,3,5" Height="23" SelectionChanged="ComboZeiteinheit_SelectionChanged"/> Grid.Row="4"
Grid.Column="0"
Margin="3,5,3,5"
VerticalAlignment="Center"
Foreground="Black"
Text="{markup:Translate Zeiteinheit der Dauer}"
TextWrapping="Wrap" />
<ComboBox
x:Name="ComboZeiteinheit"
Grid.Row="4"
Grid.Column="0"
Grid.ColumnSpan="2"
Height="23"
Margin="160,5,3,5"
SelectionChanged="ComboZeiteinheit_SelectionChanged" />
<CheckBox Margin="3,5,3,5" Content="{markup:Translate Enddatum anzeigen}" IsChecked="{Binding Path=IsEndDateVisible}" Grid.ColumnSpan="2" Grid.Row="6" /> <CheckBox
Grid.Row="6"
Grid.ColumnSpan="2"
Margin="3,5,3,5"
Content="{markup:Translate Enddatum anzeigen}"
IsChecked="{Binding Path=IsEndDateVisible}" />
<CheckBox x:Name="EnableArbeitszeiterfassung" Margin="3,20,3,5" Content="{markup:Translate Arbeitszeit mit BeWoPlaner erfassen}" IsChecked="{Binding Path=EnableArbeitszeiterfassung}" Grid.ColumnSpan="2" Grid.Row="7" /> <CheckBox
<CheckBox x:Name="EnableAutomaticPauses" Margin="3,5,3,5" Content="{markup:Translate Automatischer Pausenabzug}" IsChecked="{Binding Path=EnableAutomaticPauses}" Grid.ColumnSpan="2" Grid.Row="8" /> x:Name="EnableArbeitszeiterfassung"
<CheckBox x:Name="EnableRestTimeWarning" Margin="3,5,3,5" Content="{markup:Translate Warnung bei nicht einhalten der Ruhezeit}" IsChecked="{Binding Path=EnableRestTimeWarning}" Grid.ColumnSpan="2" Grid.Row="9" /> Grid.Row="7"
Grid.ColumnSpan="2"
Margin="3,20,3,5"
Content="{markup:Translate Arbeitszeit mit BeWoPlaner erfassen}"
IsChecked="{Binding Path=EnableArbeitszeiterfassung}" />
<CheckBox
x:Name="EnableAutomaticPauses"
Grid.Row="8"
Grid.ColumnSpan="2"
Margin="3,5,3,5"
Content="{markup:Translate Automatischer Pausenabzug}"
IsChecked="{Binding Path=EnableAutomaticPauses}" />
<CheckBox
x:Name="EnableRestTimeWarning"
Grid.Row="9"
Grid.ColumnSpan="2"
Margin="3,5,3,5"
Content="{markup:Translate Warnung bei nicht einhalten der Ruhezeit}"
IsChecked="{Binding Path=EnableRestTimeWarning}" />
<TextBlock x:Name="TextBlockShowWarning" Foreground="Black" Grid.Column="0" Grid.Row="10" Margin="3,5,3,5" TextWrapping="Wrap" VerticalAlignment="Center" Text="{markup:Translate Anzahl Stunden\, ab der eine Warnung angezeigt wird}"/> <TextBlock
<dxe:SpinEdit x:Name="SpinEditShowWarning" IsFloatValue="False" Value="10" MinValue="0" Grid.Column="1" Grid.Row="10" Margin="3,5,3,5" Height="23" EditValue="{Binding Path=MaxWorkTimeHoursBeforeWarning, Converter={StaticResource Int2DecimalConverter}}" /> x:Name="TextBlockShowWarning"
Grid.Row="10"
Grid.Column="0"
Margin="3,5,3,5"
VerticalAlignment="Center"
Foreground="Black"
Text="{markup:Translate Anzahl Stunden\, ab der eine Warnung angezeigt wird}"
TextWrapping="Wrap" />
<dxe:SpinEdit
x:Name="SpinEditShowWarning"
Grid.Row="10"
Grid.Column="1"
Height="23"
Margin="3,5,3,5"
EditValue="{Binding Path=MaxWorkTimeHoursBeforeWarning, Converter={StaticResource Int2DecimalConverter}}"
IsFloatValue="False"
MinValue="0"
Value="10" />
</Grid> </Grid>
</GroupBox> </GroupBox>
<GroupBox Margin="3 20 3 3" Grid.Row="5" Grid.ColumnSpan="2" Header="Rechnungsnummer" Style="{StaticResource ObjectEditGroupBox}"> <GroupBox
Grid.Row="5"
Grid.ColumnSpan="2"
Margin="3,20,3,3"
Header="Rechnungsnummer"
Style="{StaticResource ObjectEditGroupBox}">
<Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch"> <Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" /> <ColumnDefinition Width="Auto" />
@@ -162,38 +391,100 @@
<RowDefinition Height="*" /> <RowDefinition Height="*" />
</Grid.RowDefinitions> </Grid.RowDefinitions>
<Label Content="Automatische Rechnungsnummer verwenden" Margin="3" VerticalAlignment="Center" /> <Label
<dxe:CheckEdit Grid.Column="1" Width="200" Margin="3" Height="23" IsChecked="{Binding InvoiceNumber.Use}" /> Margin="3"
VerticalAlignment="Center"
Content="Automatische Rechnungsnummer verwenden" />
<dxe:CheckEdit
Grid.Column="1"
Width="200"
Height="23"
Margin="3"
IsChecked="{Binding InvoiceNumber.Use}" />
<Label x:Name="lblSchema" Content="Schema" Grid.Row="1" Margin="3" VerticalAlignment="Center" /> <Label
<TextBox x:Name="txtSchema" Grid.Column="1" Grid.Row="1" Width="200" Margin="3" Height="23" Text="{Binding InvoiceNumber.Pattern}" /> x:Name="lblSchema"
Grid.Row="1"
Margin="3"
VerticalAlignment="Center"
Content="Schema" />
<TextBox
x:Name="txtSchema"
Grid.Row="1"
Grid.Column="1"
Width="200"
Height="23"
Margin="3"
Text="{Binding InvoiceNumber.Pattern}" />
<Label x:Name="lblNumber" Content="Aktuelle Nummer" Grid.Row="2" Margin="3" VerticalAlignment="Center" /> <Label
<dxe:SpinEdit Name="spinedit_number" Grid.Column="1" Grid.Row="2" IsFloatValue="False" MaxValue="999999999" x:Name="lblNumber"
Height="23" Width="200" EditValue="{Binding Path=InvoiceNumber.CurrentNumber, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource Int2DecimalConverter}}" /> Grid.Row="2"
Margin="3"
VerticalAlignment="Center"
Content="Aktuelle Nummer" />
<dxe:SpinEdit
Name="spinedit_number"
Grid.Row="2"
Grid.Column="1"
Width="200"
Height="23"
EditValue="{Binding Path=InvoiceNumber.CurrentNumber, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource Int2DecimalConverter}}"
IsFloatValue="False"
MaxValue="999999999" />
<dxg:GridControl x:Name="GridControlInvoiceNumbers" Margin="0,10,0,0" Grid.Column="0" Grid.Row="3" Grid.ColumnSpan="2" ItemsSource="{Binding InvoiceNumberList}"> <dxg:GridControl
x:Name="GridControlInvoiceNumbers"
Grid.Row="3"
Grid.Column="0"
Grid.ColumnSpan="2"
Margin="0,10,0,0"
ItemsSource="{Binding InvoiceNumberList}">
<dxg:GridControl.Columns> <dxg:GridControl.Columns>
<dxg:GridColumn FieldName="Name" Header="Name" Width="100" SortOrder="Ascending" SortIndex="0" AllowEditing="False"> <dxg:GridColumn
Width="100"
</dxg:GridColumn> AllowEditing="False"
<dxg:GridColumn FieldName="Pattern" Header="Schema" Width="100"> FieldName="Name"
</dxg:GridColumn> Header="Name"
<dxg:GridColumn FieldName="CurrentNumber" Header="Aktuelle Nummer" Width="100"> SortIndex="0"
SortOrder="Ascending" />
<dxg:GridColumn
Width="100"
FieldName="Pattern"
Header="Schema" />
<dxg:GridColumn
Width="100"
FieldName="CurrentNumber"
Header="Aktuelle Nummer">
<dxg:GridColumn.EditSettings> <dxg:GridColumn.EditSettings>
<dxe:TextEditSettings DisplayFormat="0" Mask="########0" MaskType="Numeric"></dxe:TextEditSettings> <dxe:TextEditSettings
DisplayFormat="0"
Mask="########0"
MaskType="Numeric" />
</dxg:GridColumn.EditSettings> </dxg:GridColumn.EditSettings>
</dxg:GridColumn> </dxg:GridColumn>
</dxg:GridControl.Columns> </dxg:GridControl.Columns>
<dxg:GridControl.View> <dxg:GridControl.View>
<dxg:TableView AutoWidth="true" ShowGroupPanel="False" ShowGroupedColumns="false" ShowTotalSummary="False" NavigationStyle="Cell" /> <dxg:TableView
AutoWidth="true"
NavigationStyle="Cell"
ShowGroupPanel="False"
ShowGroupedColumns="false"
ShowTotalSummary="False" />
</dxg:GridControl.View> </dxg:GridControl.View>
</dxg:GridControl> </dxg:GridControl>
</Grid> </Grid>
</GroupBox> </GroupBox>
<GroupBox x:Name="groupBoxSozio" Margin="3 20 3 3" Grid.Row="6" Grid.ColumnSpan="2" Header="Soziotherapie" Style="{StaticResource ObjectEditGroupBox}" Visibility="Collapsed"> <GroupBox
<!--Kann frei genutzt werden--> x:Name="groupBoxSozio"
Grid.Row="6"
Grid.ColumnSpan="2"
Margin="3,20,3,3"
Header="Soziotherapie"
Style="{StaticResource ObjectEditGroupBox}"
Visibility="Collapsed">
<!-- Kann frei genutzt werden -->
<Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch"> <Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" /> <ColumnDefinition Width="Auto" />
@@ -205,7 +496,13 @@
</Grid> </Grid>
</GroupBox> </GroupBox>
<GroupBox Margin="3 20 3 3" x:Name="GroupOwnChatSettings" Grid.Row="7" Grid.ColumnSpan="2" Header="{markup:Translate ownChat Einstellungen}" Style="{StaticResource ObjectEditGroupBox}"> <GroupBox
x:Name="GroupOwnChatSettings"
Grid.Row="7"
Grid.ColumnSpan="2"
Margin="3,20,3,3"
Header="{markup:Translate ownChat Einstellungen}"
Style="{StaticResource ObjectEditGroupBox}">
<Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch"> <Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
<ColumnDefinition Width="*" /> <ColumnDefinition Width="*" />
@@ -214,10 +511,17 @@
<RowDefinition Height="*" /> <RowDefinition Height="*" />
</Grid.RowDefinitions> </Grid.RowDefinitions>
<TextBlock VerticalAlignment="Center" Margin="8,10,0,0" FontSize="12" Foreground="{DynamicResource MainGroupBoxForegroundBrush}"> <TextBlock
<Hyperlink x:Name="HyperlinkOwnChatSettings" TargetName="_NewWindow" Click="Hyperlink_ShowOwnChatSettings_Click"> Margin="8,10,0,0"
VerticalAlignment="Center"
FontSize="12"
Foreground="{DynamicResource MainGroupBoxForegroundBrush}">
<Hyperlink
x:Name="HyperlinkOwnChatSettings"
Click="Hyperlink_ShowOwnChatSettings_Click"
TargetName="_NewWindow">
<Hyperlink.Inlines> <Hyperlink.Inlines>
<Run Text="{markup:Translate ownChat Einstellungen öffnen}"/> <Run Text="{markup:Translate ownChat Einstellungen öffnen}" />
</Hyperlink.Inlines> </Hyperlink.Inlines>
</Hyperlink> </Hyperlink>
</TextBlock> </TextBlock>

View File

@@ -18,6 +18,7 @@ namespace DakotaSender
class Program class Program
{ {
static readonly string TEST_TENANT = "5000000000"; static readonly string TEST_TENANT = "5000000000";
static readonly string TEST_TENANT_2 = "7375324044";
static bool time_in_line = false; static bool time_in_line = false;
static bool is_dakota_running = false; static bool is_dakota_running = false;
@@ -49,6 +50,7 @@ namespace DakotaSender
if (is_dakota_running) if (is_dakota_running)
{ {
PrintSeperator();
PrintLine($"Verarbeitung im Silent Modus fehlgeschlagen. dakota30.exe läuft (bereits)."); PrintLine($"Verarbeitung im Silent Modus fehlgeschlagen. dakota30.exe läuft (bereits).");
PrintLine("Ignoriere Verarbeitung aktuell. Versuche im nächsten Programm Aufruf erneut."); PrintLine("Ignoriere Verarbeitung aktuell. Versuche im nächsten Programm Aufruf erneut.");
} }
@@ -118,6 +120,7 @@ namespace DakotaSender
PrintSeperator(); PrintSeperator();
} }
static Dictionary<string, Dictionary<string, List<DakotaSystemFile>>> ScanQueueFolder() static Dictionary<string, Dictionary<string, List<DakotaSystemFile>>> ScanQueueFolder()
{ {
var queue = Config.QueueFolder; var queue = Config.QueueFolder;
@@ -128,46 +131,13 @@ namespace DakotaSender
var ten2dat2files = new Dictionary<string, Dictionary<string, List<DakotaSystemFile>>>(); var ten2dat2files = new Dictionary<string, Dictionary<string, List<DakotaSystemFile>>>();
foreach (var auft in files) foreach (var auft in files)
{ {
var nutz_fullname = auft.FullName.Substring(0, auft.FullName.Length - 4); var file = ScanQueueFile(auft);
var nutz = new FileInfo(nutz_fullname);
if (!nutz.Exists) if (file is null)
{
PrintLine($"{auft.FullName} wird ignoriert. {nutz.FullName} nicht vorhanden");
continue; continue;
}
PrintLine($"- {auft.FullName}"); var tenant = file.Tenant;
var datenannahmestelle = file.Datenannahmestelle;
var split = nutz.Name.Split('_');
var tenant = split[0];
var app_oid = long.Parse(split[1]);
var p_oid = long.Parse(split[2]);
var datenannahmestelle = split[3];
var transfername = split[4];
// Muss nachher nur entfernt werden, um andere zu testen
// Ggf Tool einbauen?
if (tenant != TEST_TENANT && tenant != "demo")
{
PrintLine($"{auft.FullName} wird ignoriert. Tenant {tenant} nicht gültig.");
continue;
}
else
{
tenant = TEST_TENANT;
}
var file = new DakotaSystemFile()
{
SourceAuftragsdatei = auft,
SourceNutzdatendatei = nutz,
Tenant = tenant,
ProtokollOid = p_oid,
ApplicationUserOid = app_oid,
Datenannahmestelle = datenannahmestelle,
Transfername = transfername,
};
if (!ten2dat2files.ContainsKey(tenant)) if (!ten2dat2files.ContainsKey(tenant))
ten2dat2files.Add(tenant, new Dictionary<string, List<DakotaSystemFile>>()); ten2dat2files.Add(tenant, new Dictionary<string, List<DakotaSystemFile>>());
@@ -183,7 +153,57 @@ namespace DakotaSender
if (ten2dat2files.Any()) if (ten2dat2files.Any())
return ten2dat2files; return ten2dat2files;
PrintLine("Keine Dakota Dateien in Queue gefunden."); PrintLine("Keine gültigen Dakota Dateien in Queue gefunden.");
return null;
}
static DakotaSystemFile ScanQueueFile(FileInfo auft)
{
try
{
var nutz_fullname = auft.FullName.Substring(0, auft.FullName.Length - 4);
var nutz = new FileInfo(nutz_fullname);
if (!nutz.Exists)
{
PrintLine($"{auft.FullName} wird ignoriert. {nutz.FullName} nicht vorhanden");
return null;
}
PrintLine($"- {auft.FullName}");
var split = nutz.Name.Split('_');
var tenant = split[0];
var app_oid = long.Parse(split[1]);
var p_oid = long.Parse(split[2]);
var datenannahmestelle = split[3];
var transfername = split[4];
// Muss nachher nur entfernt werden, um andere zu testen
// Ggf Tool einbauen?
if (tenant != TEST_TENANT && tenant != TEST_TENANT_2)
{
PrintLine($"{auft.FullName} wird ignoriert. Tenant {tenant} nicht gültig.");
return null;
}
var file = new DakotaSystemFile()
{
SourceAuftragsdatei = auft,
SourceNutzdatendatei = nutz,
Tenant = tenant,
ProtokollOid = p_oid,
ApplicationUserOid = app_oid,
Datenannahmestelle = datenannahmestelle,
Transfername = transfername,
};
return file;
}
catch(Exception e)
{
PrintException(e);
}
return null; return null;
} }
@@ -381,11 +401,11 @@ namespace DakotaSender
else else
PrintLine("Fehler: " + res.Message); PrintLine("Fehler: " + res.Message);
} }
catch(GkvException e) catch (GkvException e)
{ {
PrintException(e); PrintException(e);
} }
catch(Exception e) catch (Exception e)
{ {
PrintException(e); PrintException(e);
} }

View File

@@ -10,8 +10,8 @@ namespace DakotaSender
{ {
const int RC_DAKOTA_ALREADY_LOADED = 18; const int RC_DAKOTA_ALREADY_LOADED = 18;
static readonly int[] AcceptStatusCodes = new int[] { 0 }; static readonly int[] AcceptStatusCodes = new int[] { 0, 1, 100, 101 };
static readonly int[] AcceptSendCodes = new int[] { 0 }; static readonly int[] AcceptSendCodes = new int[] { 0, 1 };
static readonly Dictionary<int, string> StatusReturncodeToMeaning = new Dictionary<int, string>() static readonly Dictionary<int, string> StatusReturncodeToMeaning = new Dictionary<int, string>()
{ {

View File

@@ -5956,7 +5956,7 @@ namespace BeWo.Data.Access
var t = criteria.List<int?>().SingleOrDefault(); var t = criteria.List<int?>().SingleOrDefault();
return t + 1?? 0; return t + 1 ?? 0;
} }
public List<Bargeldtransaktionshistory> LoadBargeldtransaktionshistoryEntriesByTransaktionsOids(List<long> transaktionsOids) public List<Bargeldtransaktionshistory> LoadBargeldtransaktionshistoryEntriesByTransaktionsOids(List<long> transaktionsOids)

View File

@@ -75,32 +75,9 @@ namespace Host
try try
{ {
foreach (var result in req.ResultDCs) var service = new AccountingServiceImp();
{
HandleResult(result);
}
var follows = req.ResultDCs.Where(x => x.ResultType == GkvTransferResultType.FailFollowUp); service.HandleGkvServerResults(req.ResultDCs);
if (follows.Any())
{
var service = new AccountingServiceImp();
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 = service.SendNewGkvAbrechnung(new_req);
if (!res.Success)
throw new GkvException(res.Message);
}
}
response.Success = true; response.Success = true;
} }
@@ -116,34 +93,6 @@ namespace Host
SendResponse(response); SendResponse(response);
} }
private void HandleResult(GkvServerResultDC result)
{
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;
}
DAOFactory.GenericDAO.Update(protokoll);
}
#region Senden #region Senden
private void SendInvalidInputResponse() => SendErrorResponse(INVALID_INPUT); private void SendInvalidInputResponse() => SendErrorResponse(INVALID_INPUT);
private void SendErrorResponse(string message) private void SendErrorResponse(string message)

View File

@@ -200,7 +200,7 @@ namespace Host
var tuple_count = req.Oids.Length; var tuple_count = req.Oids.Length;
response.ResultDC = new GkvServerResultDC[tuple_count]; response.Results = new GkvServerResultDC[tuple_count];
try try
{ {
@@ -214,7 +214,7 @@ namespace Host
if (results.TryGetValue(gkv_transfer_oid, out var fehlerDC)) if (results.TryGetValue(gkv_transfer_oid, out var fehlerDC))
{ {
response.ResultDC[i] = fehlerDC; response.Results[i] = fehlerDC;
} }
} }

View File

@@ -241,6 +241,7 @@
<add key="GkvKostentragerdateiFolderPath" value="C:\GkvAbrechnung\KTDatei\" /> <add key="GkvKostentragerdateiFolderPath" value="C:\GkvAbrechnung\KTDatei\" />
<add key="DakotaPath" value="C:\Program Files (x86)\ITSG\dakotale\dakota30.exe" /> <add key="DakotaPath" value="C:\Program Files (x86)\ITSG\dakotale\dakota30.exe" />
<add key="GkvSecretKey" value="DfDGNGn72PKfSYxSUsmRdzuBtpR9novewlmYU3gsjiFgSkaZZeylUXlbO42cWNqiKgLdMUFtWUNZT962F1raQDR7HGUzCNYsFeC" /> <add key="GkvSecretKey" value="DfDGNGn72PKfSYxSUsmRdzuBtpR9novewlmYU3gsjiFgSkaZZeylUXlbO42cWNqiKgLdMUFtWUNZT962F1raQDR7HGUzCNYsFeC" />
<add key="App8IpAddress" value="88.198.50.220" />
</appSettings> </appSettings>
<devExpress> <devExpress>
<themes enableThemesAssembly="true" styleSheetTheme="" theme="" /> <themes enableThemesAssembly="true" styleSheetTheme="" theme="" />

View File

@@ -13,13 +13,10 @@ using System.Text;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using System.Xml; using System.Xml;
using BeWo.Data;
using BeWo.Data.Entities; using BeWo.Data.Entities;
using BeWo.Service.ServiceContracts; using BeWo.Service.ServiceContracts;
using BeWo.Data;
using BeWo.Data.Access;
using BeWo.View.Navigation.Filter;
using BS.Shared; using BS.Shared;
using BS.Shared.DataContracts;
using BS.Shared.Extensions; using BS.Shared.Extensions;
namespace BeWo.Service.Core namespace BeWo.Service.Core

View File

@@ -60,7 +60,7 @@ namespace BeWo.Service.DCEntityMapper
break; break;
case BS.Shared.GkvState.ErrorFolgefehler: case BS.Shared.GkvState.ErrorFolgefehler:
isReady = false; isReady = false;
tooltip = "Folge Fehler"; tooltip = "Folgefehler";
break; break;
case BS.Shared.GkvState.Paid: case BS.Shared.GkvState.Paid:
isReady = false; isReady = false;

View File

@@ -1104,7 +1104,7 @@ namespace BeWo.Service.ServiceImplementations
} }
else else
{ {
throw new ArgumentException("Versucht Datenaustauschref zu laden, invalid state", nameof(state)); throw new ArgumentException("Versucht Transfernummer zu laden, invalid state", nameof(state));
} }
return new Tuple<int, int>(datenaustauschref, transfernummer); return new Tuple<int, int>(datenaustauschref, transfernummer);
@@ -1178,51 +1178,72 @@ namespace BeWo.Service.ServiceImplementations
if (!response_app8.Success) if (!response_app8.Success)
throw new GkvException(response_app8.Message); throw new GkvException(response_app8.Message);
bool allAreUpToDate = true; var results = response_app8.Results.Where(x => x is object);
for (int id = 0; id < updateables_len; id++)
{
var gkv_abrechnung = updateables[id];
var result = response_app8.ResultDC[id];
if (result is null) if (!results.Any())
continue; return true;
allAreUpToDate = false; HandleGkvServerResults(results);
HandleResult(result); return false;
}
return allAreUpToDate;
} }
private void HandleResult(GkvServerResultDC result) public void HandleGkvServerResults(IEnumerable<GkvServerResultDC> results)
{ {
var protokoll = DAOFactory.GenericDAO.GetByID<GkvTransferProtokoll>(result.ProtokollOid); var protokolls = new List<GkvTransferProtokoll>();
foreach (var result in results)
protokoll.ResultType = result.ResultType;
protokoll.Fehlertitel = result.Titel;
protokoll.Fehlerdatum = result.Datum;
protokoll.Fehlernachricht = result.Nachricht;
switch (result.ResultType)
{ {
case GkvTransferResultType.Success: var protokoll = DAOFactory.GenericDAO.GetByID<GkvTransferProtokoll>(result.ProtokollOid);
protokoll.SentDakotaSuccess = true;
break; protokoll.ResultType = result.ResultType;
case GkvTransferResultType.FailSoft: protokoll.Fehlertitel = result.Titel;
protokoll.SentApp8Success = false; protokoll.Fehlerdatum = result.Datum;
break; protokoll.Fehlernachricht = result.Nachricht;
case GkvTransferResultType.FailFatal:
protokoll.SentApp8Success = false; switch (result.ResultType)
break; {
case GkvTransferResultType.FailFollowUp: case GkvTransferResultType.Success:
protokoll.SentApp8Success = false; protokoll.SentDakotaSuccess = true;
break; 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);
} }
DAOFactory.GenericDAO.Update(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(res.Message);
}
}
}
private Res SendApp8Request<Req, Res>(Req request) where Req : GkvRequestDC where Res : GkvResponseDC private Res SendApp8Request<Req, Res>(Req request) where Req : GkvRequestDC where Res : GkvResponseDC
{ {

View File

@@ -13,6 +13,6 @@ namespace BS.Shared.DataContracts.GkvAbrechnung
public GkvServerGetStatusResponseDC(bool success) : base(success) { } public GkvServerGetStatusResponseDC(bool success) : base(success) { }
public GkvServerGetStatusResponseDC(bool success, string message) : base(success, message) { } public GkvServerGetStatusResponseDC(bool success, string message) : base(success, message) { }
[DataMember] public GkvServerResultDC[] ResultDC { get; set; } [DataMember] public GkvServerResultDC[] Results { get; set; }
} }
} }