Perseh Schnittstelle, diverse Todos fürs Release + Anpassungen Schulbegleitung Hildmann/Kloss Betreuungszeiten

This commit is contained in:
Christian
2024-09-01 20:47:02 +02:00
parent a8fe8cd6b0
commit 188c16d467
50 changed files with 2483 additions and 1550 deletions

View File

@@ -16,7 +16,7 @@
<EnableSecurityDebugging>true</EnableSecurityDebugging>
<TargetZone>Internet</TargetZone>
<GenerateManifests>true</GenerateManifests>
<SignManifests>false</SignManifests>
<SignManifests>true</SignManifests>
<ManifestKeyFile>
</ManifestKeyFile>
<ManifestCertificateThumbprint>8CA4066C36C87B745E4016FDA715A6DB16FCFFA9</ManifestCertificateThumbprint>
@@ -43,12 +43,12 @@
<TargetCulture>de-DE</TargetCulture>
<ProductName>BeWoPlaner</ProductName>
<PublisherName>ownSoft GmbH</PublisherName>
<MinimumRequiredVersion>2.0.1.248</MinimumRequiredVersion>
<MinimumRequiredVersion>2.0.1.249</MinimumRequiredVersion>
<CreateWebPageOnPublish>true</CreateWebPageOnPublish>
<WebPage>publish.htm</WebPage>
<OpenBrowserOnPublish>false</OpenBrowserOnPublish>
<TrustUrlParameters>true</TrustUrlParameters>
<ApplicationRevision>249</ApplicationRevision>
<ApplicationRevision>250</ApplicationRevision>
<ApplicationVersion>2.0.1.%2a</ApplicationVersion>
<UseApplicationTrust>false</UseApplicationTrust>
<CreateDesktopShortcut>true</CreateDesktopShortcut>

View File

@@ -50,7 +50,7 @@ namespace BeWo
public static MainControl MainControl;
public static string ShortVersion = "3.21";
public static string Version = "Version 3.21.4";
public static string Version = "Version 3.21.5";
public static int RenderTier = 0;

View File

@@ -244,15 +244,19 @@ namespace BeWo
//!!!!Wenn hier neue Keys hinzugefügt werden, muss das auch in der Klasse ChatController.HauptKlassen.Chat und im DatabaseTerminator gemacht werden!!
private static String PUB_KEY_X3 = "3082010A02820101009CD30CF05AE52E47B7725D3783B3686330EAD735261925E1BDBE35F170922FB7B84B4105ABA99E350858ECB12AC468870BA3E375E4E6F3A76271BA7981601FD7919A9FF3D0786771C8690E9591CFFEE699E9603C48CC7ECA4D7712249D471B5AEBB9EC1E37001C9CAC7BA705EACE4AEBBD41E53698B9CBFD6D3C9668DF232A42900C867467C87FA59AB8526114133F65E98287CBDBFA0E56F68689F3853F9786AFB0DC1AEF6B0D95167DC42BA065B299043675806BAC4AF31B9049782FA2964F2A20252904C674C0D031CD8F31389516BAA833B843F1B11FC3307FA27931133D2D36F8E3FCF2336AB93931C5AFC48D0D1D641633AAFA8429B6D40BC0D87DC3930203010001";
private static String PUB_KEY_X3 = "9CD30CF05AE52E47B7725D3783B3686330EAD735261925E1BDBE35F170922FB7B84B4105ABA99E350858ECB12AC468870BA3E375E4E6F3A76271BA7981601FD7919A9FF3D0786771C8690E9591CFFEE699E9603C48CC7ECA4D7712249D471B5AEBB9EC1E37001C9CAC7BA705EACE4AEBBD41E53698B9CBFD6D3C9668DF232A42900C867467C87FA59AB8526114133F65E98287CBDBFA0E56F68689F3853F9786AFB0DC1AEF6B0D95167DC42BA065B299043675806BAC4AF31B9049782FA2964F2A20252904C674C0D031CD8F31389516BAA833B843F1B11FC3307FA27931133D2D36F8E3FCF2336AB93931C5AFC48D0D1D641633AAFA8429B6D40BC0D87DC3930203010001";
private static String PUB_KEY_R3 = "3082010A0282010100BB021528CCF6A094D30F12EC8D5592C3F882F199A67A4288A75D26AAB52BB9C54CB1AF8E6BF975C8A3D70F4794145535578C9EA8A23919F5823C42A94E6EF53BC32EDB8DC0B05CF35938E7EDCF69F05A0B1BBEC094242587FA3771B313E71CACE19BEFDBE43B45524596A9C153CE34C852EEB5AEED8FDE6070E2A554ABB66D0E97A540346B2BD3BC66EB66347CFA6B8B8F572999F830175DBA726FFB81C5ADD286583D17C7E709BBF12BF786DCC1DA715DD446E3CCAD25C188BC60677566B3F118F7A25CE653FF3A88B647A5FF1318EA9809773F9D53F9CF01E5F5A6701714AF63A4FF99B3939DDC53A706FE48851DA169AE2575BB13CC5203F5ED51A18BDB150203010001";
private static String PUB_KEY_R3 = "BB021528CCF6A094D30F12EC8D5592C3F882F199A67A4288A75D26AAB52BB9C54CB1AF8E6BF975C8A3D70F4794145535578C9EA8A23919F5823C42A94E6EF53BC32EDB8DC0B05CF35938E7EDCF69F05A0B1BBEC094242587FA3771B313E71CACE19BEFDBE43B45524596A9C153CE34C852EEB5AEED8FDE6070E2A554ABB66D0E97A540346B2BD3BC66EB66347CFA6B8B8F572999F830175DBA726FFB81C5ADD286583D17C7E709BBF12BF786DCC1DA715DD446E3CCAD25C188BC60677566B3F118F7A25CE653FF3A88B647A5FF1318EA9809773F9D53F9CF01E5F5A6701714AF63A4FF99B3939DDC53A706FE48851DA169AE2575BB13CC5203F5ED51A18BDB150203010001";
private static String PUB_KEY_E1 = "04245C2DA22AFD1C4BA65D97732731ACB2A06962EF65E8A6B0F0AC4B9FFF1C0B700FD3982F4DFC0F009B37F074055732972E05EF2A4325A3FB6E342713F64F7E69D302995EEB244792C1249BE6B1218FC12481FC68CC1F69BA58F51922F774C616";
private static String PUB_KEY_E1 = "245c2da22afd1c4ba65d97732731acb2a06962ef65e8a6b0f0ac4b9fff1c0b700fd3982f4dfc0f009b37f074055732972e05ef2a4325a3fb6e342713f64f7e69d302995eeb244792c1249be6b1218fc12481fc68cc1f69ba58f51922f774c616";
private static String PUB_KEY_R11 = "3082010A0282010100BA87BC5C1B0039CBCA0ACDD46710F9013CA54EA561CB26CA52FB1501B7B928F5281EED27B324183967090C08ECE03AB03B770EBDF3E53954410C4EAE41D69974DE51DBEF7BFF58BDA8B713F6DE31D5F272C9726A0B8374959C4600641499F3B1D922D9CDA892AA1C267A3FFEEF58057B089581DB710F8EFBE33109BB09BE504D5F8F91763D5A9D9E83F2E9C466B3E106664348188065A037189A9B843297B1B2BDC4F815009D2788FBE26317966C9B27674BC4DB285E69C279F0495CE02450E1C4BCA105AC7B406D00B4C2413FA758B82FC55C9BA5BB099EF1FEEBB08539FDA80AEF45C478EB652AC2CF5F3CDEE35C4D1BF70B272BAA0B4277534F796A1D87D90203010001";
private static String PUB_KEY_E5 = "0d0b3a8a6b618eb6efdc5f58e7c6424554ab63f66661480a2e5975b481023750b73f1679dc98eca1289772201c2ccfd57c52204e54785b84146bc090ae85ecc051413c5a877f064dd4fe60d1fa6c2de17d951088a208540f991a4ce6ea0aacd8";
private static String PUB_KEY_R10 = "3082010A0282010100CF57E5E6C45412EDB447FEC92758764650288C1D3E88DF059DD5B51829BDDDB55ABFFAF6CEA3BEAF00214B625A5A3C012FC55803F689FF8E1143EBC1B5E01407968F6F1FD7E7BA8139097565B7C2AF185B372628E7A3F4072B6D1AFFAB58BC95AE40FFE9CB57C4B55B7F780D1861BC17E754C6BB4991CD6E18D18085EEA66536BC74EABC504CEAFC21F338169394BAB0D36B3806CD16127ACA5275C8AD76B2C29C5D98455C6F617BC62DEE3C13528601D957E6381CDF8DB51F92919AE74A1CCC45A87255F0B0E6A307ECFDA71B669E3F488B71847158C93AFAEF5EF25B442B3C74E78FB247C1076ACD9AB70D96F712812651540AEC61F6F7F5E2F28AC8950D8D0203010001";
private static String PUB_KEY_E6 = "d9f19e4687f8217160a826eba3fab9eada1db912a7d426d95114b1617c7596bf220b391fd5bed10a46aa2d3c4a09842ebe409555e91940376675ed324e770449f8707bc318e7cef77110feac74d800d4ed6d1c731633109c3ab2ea6c62f4bdb8";
private static String PUB_KEY_R10 = "CF57E5E6C45412EDB447FEC92758764650288C1D3E88DF059DD5B51829BDDDB55ABFFAF6CEA3BEAF00214B625A5A3C012FC55803F689FF8E1143EBC1B5E01407968F6F1FD7E7BA8139097565B7C2AF185B372628E7A3F4072B6D1AFFAB58BC95AE40FFE9CB57C4B55B7F780D1861BC17E754C6BB4991CD6E18D18085EEA66536BC74EABC504CEAFC21F338169394BAB0D36B3806CD16127ACA5275C8AD76B2C29C5D98455C6F617BC62DEE3C13528601D957E6381CDF8DB51F92919AE74A1CCC45A87255F0B0E6A307ECFDA71B669E3F488B71847158C93AFAEF5EF25B442B3C74E78FB247C1076ACD9AB70D96F712812651540AEC61F6F7F5E2F28AC8950D8D0203010001";
private static String PUB_KEY_R11 = "BA87BC5C1B0039CBCA0ACDD46710F9013CA54EA561CB26CA52FB1501B7B928F5281EED27B324183967090C08ECE03AB03B770EBDF3E53954410C4EAE41D69974DE51DBEF7BFF58BDA8B713F6DE31D5F272C9726A0B8374959C4600641499F3B1D922D9CDA892AA1C267A3FFEEF58057B089581DB710F8EFBE33109BB09BE504D5F8F91763D5A9D9E83F2E9C466B3E106664348188065A037189A9B843297B1B2BDC4F815009D2788FBE26317966C9B27674BC4DB285E69C279F0495CE02450E1C4BCA105AC7B406D00B4C2413FA758B82FC55C9BA5BB099EF1FEEBB08539FDA80AEF45C478EB652AC2CF5F3CDEE35C4D1BF70B272BAA0B4277534F796A1D87D90203010001";
private bool PinPublicKey(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslpolicyerrors)
@@ -263,15 +267,18 @@ namespace BeWo
return false;
bool chainContainsPk = false;
foreach (var element in chain.ChainElements)
{
String pk = element.Certificate.GetPublicKeyString();
String testx3 = PUB_KEY_X3;
String testr3 = PUB_KEY_R3;
String teste1 = PUB_KEY_E1;
String r11 = PUB_KEY_R11;
if (pk == PUB_KEY_X3 || pk == PUB_KEY_R3 || pk == PUB_KEY_E1 || pk == PUB_KEY_R11 || pk == PUB_KEY_R10)
String pk = element.Certificate.GetPublicKeyString().ToLower();
if (pk.Contains(PUB_KEY_X3.ToLower()) ||
pk.Contains(PUB_KEY_R3.ToLower()) ||
pk.Contains(PUB_KEY_E1.ToLower()) ||
pk.Contains(PUB_KEY_E5.ToLower()) ||
pk.Contains(PUB_KEY_E6.ToLower()) ||
pk.Contains(PUB_KEY_R10.ToLower()) ||
pk.Contains(PUB_KEY_R11.ToLower()))
{
chainContainsPk = true;
}

View File

@@ -65,7 +65,7 @@
<dxg:GridColumn ReadOnly="True" AllowEditing="False" FieldName="TypeString" Header="Art der Rechnung" Width="150" />
<dxg:GridColumn ReadOnly="True" AllowEditing="False" FieldName="CustomerName" Header="{markup:Translate Klient/in}" Width="100" />
<dxg:GridColumn ReadOnly="True" AllowEditing="False" FieldName="AccountingPeriodString" SortFieldName="AccountingPeriodStart" Header="Zeitraum" Width="100" />
<dxg:GridColumn ReadOnly="True" AllowEditing="False" FieldName="InvoiceNumber" Header="Nummer" />
<dxg:GridColumn ReadOnly="True" AllowEditing="False" FieldName="InvoiceNumber" Header="Nummer" SortOrder="Ascending" />
<dxg:GridColumn ReadOnly="True" AllowEditing="False" FieldName="InvoiceDate" Header="Datum" EditSettings="{dxe:DateSettings DisplayFormat=d}" MinWidth="70" />
<dxg:GridColumn ReadOnly="True" AllowEditing="False" FieldName="RecipientString" Header="{markup:Translate EmpfängerSingular}" />
<!--<dxg:GridColumn FieldName="AccountingPeriodString" Header="Abrechnungszeitraum" />-->

View File

@@ -82,10 +82,22 @@
<TextBox Grid.Column="1" Margin="1" VerticalContentAlignment="Center" Text="{Binding ViewModel.NewVM.Description, UpdateSourceTrigger=PropertyChanged}" />
<Button Grid.Column="2" Height="25" Content="Hinzufügen" Margin="3" Click="ZielHinzufuegenButton_Click" />
<Button Grid.Column="3" Height="25" Content="Icf Importieren" Margin="3" Click="IcfImport_Click" />
<ToggleButton Grid.Column="4" Height="25" Content="Bearbeiten" Margin="3" Checked="ToggleButton_Checked" Unchecked="ToggleButton_Unchecked" Visibility="Collapsed"/>
<StackPanel Orientation="Horizontal" Grid.Column="5" Grid.Row="0" Grid.ColumnSpan="10" HorizontalAlignment="Right" Visibility="Collapsed">
<Button x:Name="PrevButton" Height="25" Content="Prev" Margin="3" Click="PrevButton_Click" />
<Button x:Name="NextButton" Height="25" Content="Next" Margin="3" Click="NextButton_Click" />
<ToggleButton x:Name="EditToggleButton" Grid.Column="4" Width="157" Height="25" Content="Bearbeiten aktivieren" Margin="3" Checked="ToggleButton_Checked" Unchecked="ToggleButton_Unchecked" Visibility="Visible" ToolTip="Wenn der Bearbeiten Modus aktiviert ist, können Sie Elemente mit Drag und Drop verschieben"/>
<StackPanel Orientation="Horizontal" Grid.Column="5" Grid.Row="0" Grid.ColumnSpan="10" HorizontalAlignment="Right" Visibility="Visible">
<Button x:Name="PrevButton" Height="25" Width="25" Margin="3" Click="PrevButton_Click" ToolTip="Letzte Änderung rückgängig machen">
<Image Source="..\..\Ressources\Icons\Undo.png" Height="18" VerticalAlignment="Center" HorizontalAlignment="Center" Width="20" Margin="0,3,0,0" />
</Button>
<Button x:Name="NextButton" Height="25" Width="25" Margin="3" Click="NextButton_Click">
<Image Source="..\..\Ressources\Icons\Undo.png" Height="18" VerticalAlignment="Center" HorizontalAlignment="Center" Width="20" Margin="0,3,0,0" />
<Button.RenderTransform>
<TransformGroup>
<ScaleTransform ScaleX="-1" />
<TranslateTransform X="25" />
</TransformGroup>
</Button.RenderTransform>
</Button>
</StackPanel>
</Grid>

View File

@@ -341,10 +341,12 @@ namespace BeWo.View.Detail
private void ToggleButton_Checked(object sender, RoutedEventArgs e)
{
Bearbeitungsmodus = true;
EditToggleButton.Content = "Bearbeiten deaktivieren";
}
private void ToggleButton_Unchecked(object sender, RoutedEventArgs e)
{
Bearbeitungsmodus = false;
EditToggleButton.Content = "Bearbeiten aktivieren";
}
private void StartCopyItem(SupportConceptGoalTreeItem _item, SupportConceptGoalTreeItem _copy)

View File

@@ -133,7 +133,7 @@
<dxg:GridColumn x:Name="column_interval" FieldName="AccountingInterval" Header="Abrechnungsintervall" Width="130" />
</dxg:GridControl.Columns>
<dxg:GridControl.View>
<dxg:TableView AutoWidth="true" ShowGroupPanel="False" ShowGroupedColumns="false" ShowTotalSummary="False" NavigationStyle="Cell" />
<dxg:TableView AutoWidth="True" ShowGroupPanel="False" ShowGroupedColumns="false" ShowTotalSummary="False" NavigationStyle="Cell" />
</dxg:GridControl.View>
</dxg:GridControl>
<Popup x:Name="popup_costrateperiods" StaysOpen="false" Placement="MousePoint">

View File

@@ -16,8 +16,8 @@
<Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
@@ -26,9 +26,8 @@
</Grid.RowDefinitions>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="80" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="180" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
@@ -39,9 +38,9 @@
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Label Grid.Column="0" Grid.Row="0">Bezeichnung</Label>
<TextBox Grid.Column="1" Grid.Row="0" Grid.ColumnSpan="2" Margin="3" Height="23" Text="{val:ValidationBinding Path=NewVM.Name, UpdateSourceTrigger=PropertyChanged}" />
<TextBox Grid.Column="1" Grid.Row="0" Margin="3" Height="23" Text="{val:ValidationBinding Path=NewVM.Name, UpdateSourceTrigger=PropertyChanged}" />
<Label Grid.Column="0" Grid.Row="1">Kategorie</Label>
<controls:NullItemComboBox Name="combobox_categories" Grid.Column="1" Grid.Row="1" Grid.ColumnSpan="2" Height="23" ItemsSource="{Binding Path=PossibleCategories, Mode=OneWay}" Margin="3" SelectedItem="{val:ValidationBinding Path=NewVM.ServiceCategory}" SelectionChanged="Combobox_categories_OnSelected">
<controls:NullItemComboBox Name="combobox_categories" Grid.Column="1" Grid.Row="1" Height="23" ItemsSource="{Binding Path=PossibleCategories, Mode=OneWay}" Margin="3" SelectedItem="{val:ValidationBinding Path=NewVM.ServiceCategory}" SelectionChanged="Combobox_categories_OnSelected">
<ComboBox.Resources>
<DataTemplate x:Key="DropDownItemTemplate">
<Grid>
@@ -66,17 +65,17 @@
</ComboBox.ItemContainerStyle>
</controls:NullItemComboBox>
<Label Content="Position" Grid.Column="0" Grid.Row="2" HorizontalAlignment="Left" Grid.ColumnSpan="2" />
<Label Content="Position" Grid.Column="0" Grid.Row="2" HorizontalAlignment="Left" />
<dxe:SpinEdit EditValueType="{x:Type sys:Int32}" MinValue="0" Margin="3" IsFloatValue="False" Grid.Column="2" Grid.Row="2" Height="23" EditValue="{Binding Path=NewVM.Position, UpdateSourceTrigger=PropertyChanged}" />
<dxe:SpinEdit EditValueType="{x:Type sys:Int32}" MinValue="0" Margin="3" IsFloatValue="False" Grid.Column="1" Grid.Row="2" Height="23" EditValue="{Binding Path=NewVM.Position, UpdateSourceTrigger=PropertyChanged}" />
<Label Grid.Column="0" Grid.Row="3" Grid.ColumnSpan="2" Content="{t:Translate Prozent Abrechenbar}"/>
<Label Grid.Column="0" Grid.Row="4" Grid.ColumnSpan="2" Content="{t:Translate Prozent Budget}"/>
<Label Grid.Column="0" Grid.Row="5" Grid.ColumnSpan="2" Content="{t:Translate Prozent Stundenkonto}"/>
<Label Grid.Column="0" Grid.Row="3" Content="{t:Translate Prozent Abrechenbar}"/>
<Label Grid.Column="0" Grid.Row="4" Content="{t:Translate Prozent Budget}"/>
<Label Grid.Column="0" Grid.Row="5" Content="{t:Translate Prozent Stundenkonto}"/>
<dxe:SpinEdit IsFloatValue="True" MinValue="0" MaxValue="100" Increment="10" Grid.Column="2" Grid.Row="3" Margin="3" Height="23" EditValue="{Binding Path=NewVM.ProzentAbrechenbar, UpdateSourceTrigger=PropertyChanged}" />
<dxe:SpinEdit IsFloatValue="True" MinValue="0" MaxValue="100" Increment="10" Grid.Column="2" Grid.Row="4" Margin="3" Height="23" EditValue="{Binding Path=NewVM.ProzentBudget, UpdateSourceTrigger=PropertyChanged}" />
<dxe:SpinEdit IsFloatValue="True" MinValue="0" MaxValue="100" Increment="10" Grid.Column="2" Grid.Row="5" Margin="3" Height="23" EditValue="{Binding Path=NewVM.ProzentStundenkonto, UpdateSourceTrigger=PropertyChanged}" />
<dxe:SpinEdit IsFloatValue="True" MinValue="0" MaxValue="100" Increment="10" Grid.Column="1" Grid.Row="3" Margin="3" Height="23" EditValue="{Binding Path=NewVM.ProzentAbrechenbar, UpdateSourceTrigger=PropertyChanged}" />
<dxe:SpinEdit IsFloatValue="True" MinValue="0" MaxValue="100" Increment="10" Grid.Column="1" Grid.Row="4" Margin="3" Height="23" EditValue="{Binding Path=NewVM.ProzentBudget, UpdateSourceTrigger=PropertyChanged}" />
<dxe:SpinEdit IsFloatValue="True" MinValue="0" MaxValue="100" Increment="10" Grid.Column="1" Grid.Row="5" Margin="3" Height="23" EditValue="{Binding Path=NewVM.ProzentStundenkonto, UpdateSourceTrigger=PropertyChanged}" />
</Grid>
@@ -112,7 +111,7 @@
</Grid>
</Border>
<Button Name="button_addServiceDescription" Click="button_addServiceDescription_Click" Grid.Column="0" Grid.Row="1" Grid.ColumnSpan="2" Height="25" Margin="3,3,3,3" Padding="5 0" IsDefault="True" HorizontalAlignment="Right">Hinzufügen</Button>
<dxg:GridControl x:Name="datagrid_descriptions" Margin="0,10,0,0" Grid.Column="0" Grid.Row="2" Grid.ColumnSpan="7" DataSource="{Binding VMList}">
<dxg:GridControl x:Name="datagrid_descriptions" Margin="0,10,0,0" Grid.Column="0" Grid.Row="2" Grid.ColumnSpan="3" DataSource="{Binding VMList}">
<dxg:GridControl.Columns>
<dxg:GridColumn FieldName="IsDeleteable" Header="" FixedWidth="True" Width="24" ReadOnly="True">
<dxg:GridColumn.CellTemplate>
@@ -140,7 +139,7 @@
<dxg:GridColumn FieldName="ProzentStundenkonto" Header="Prozent Stundenkonto" Width="130" EditSettings="{dxe:TextSettings DisplayFormat=0.##, Mask=f2, MaskType=Numeric}"/>
</dxg:GridControl.Columns>
<dxg:GridControl.View>
<dxg:TableView AutoWidth="true" ShowGroupPanel="False" ShowGroupedColumns="false" ShowTotalSummary="False" NavigationStyle="Cell" />
<dxg:TableView AutoWidth="True" ShowGroupPanel="False" ShowGroupedColumns="false" ShowTotalSummary="False" NavigationStyle="Cell" />
</dxg:GridControl.View>
</dxg:GridControl>
<Popup x:Name="popup_costrateperiods" StaysOpen="false" Placement="MousePoint">

View File

@@ -57,28 +57,31 @@ namespace BeWo.View.Detail
}
private void _YearPicker_EditValueChanged(object sender, EditValueChangedEventArgs e)
{
if (_GridLeaveDays == null)
if (_YearPicker.SelectedItem != null)
{
_GridLeaveDays = rootGrid.Resources["datagrid_leavedays"] as GridControl;
WPFGridLeaveDays.Children.Add(_GridLeaveDays);
}
var urlaubskonto = ServiceFacade.DoEmployeeServiceSync(s => s.ErstelleUrlaubskontoDarstellung(DataContract, (int)_YearPicker.SelectedItem));
if (urlaubskonto == null)
{
urlaubskonto = new List<UrlaubskontoDarstellungDC>();
urlaubskonto.Add(new UrlaubskontoDarstellungDC()
if (_GridLeaveDays == null)
{
Erlaeuterung = "Es existiert kein Vertrag für ausgewähltes Jahr",
});
button_openLeaveDayDialogue.Visibility = Visibility.Collapsed;
}
else
button_openLeaveDayDialogue.Visibility = Visibility.Visible;
_GridLeaveDays = rootGrid.Resources["datagrid_leavedays"] as GridControl;
_GridLeaveDays.ItemsSource = urlaubskonto;
WPFGridLeaveDays.Children.Add(_GridLeaveDays);
}
var urlaubskonto = ServiceFacade.DoEmployeeServiceSync(s => s.ErstelleUrlaubskontoDarstellung(DataContract, (int)_YearPicker.SelectedItem));
if (urlaubskonto == null)
{
urlaubskonto = new List<UrlaubskontoDarstellungDC>();
urlaubskonto.Add(new UrlaubskontoDarstellungDC()
{
Erlaeuterung = "Es existiert kein Vertrag für ausgewähltes Jahr",
});
button_openLeaveDayDialogue.Visibility = Visibility.Collapsed;
}
else
button_openLeaveDayDialogue.Visibility = Visibility.Visible;
_GridLeaveDays.ItemsSource = urlaubskonto;
}
}
private void button_addLeaveDay_Click(object sender, RoutedEventArgs e)

View File

@@ -13,11 +13,27 @@ namespace BeWo.View.Detail.Zeiterfassung
{
public partial class ServiceRecordCreationView
{
private DateTime _StartDatum;
private DateTime _EndDatum;
public DateTime StartDatum { get; set; }
public DateTime StartDatum
{
get { return _StartDatum; }
set
{
_StartDatum = value;
UpdateSelectedArbeitszeitVm();
}
}
public DateTime EndDatum { get; set; }
public DateTime EndDatum {
get { return _EndDatum; }
set
{
_EndDatum = value;
UpdateSelectedArbeitszeitVm();
}
}
public SupportConceptCostBearerRelDC SupportConceptCostBearerRel { get; set; }
@@ -44,7 +60,13 @@ namespace BeWo.View.Detail.Zeiterfassung
private void UpdateSelectedArbeitszeitVm()
{
SelectedArbeitszeitVM = ArbeitszeitListVM.VMList[0];
foreach (var item in ArbeitszeitListVM.VMList)
{
if ((!item.GueltigVon.HasValue || item.GueltigVon <= EndDatum) && (!item.GueltigBis.HasValue || item.GueltigBis >= StartDatum))
{
SelectedArbeitszeitVM = item;
}
}
}

View File

@@ -54,7 +54,8 @@ namespace BeWo.View.Navigation
{
textblock_link.Visibility = Visibility.Collapsed;
}
//###CB SERIENBRIEF mainNavigationView.MailMergeButton.Visibility = Visibility.Collapsed;
mainNavigationView.chkShowDeleted.Visibility = Visibility.Collapsed;
//###CB SERIENBRIEF mainNavigationView.MailMergeButton.Visibility = Visibility.Collapsed;
}
private void OnLoaded(object sender, RoutedEventArgs e)

View File

@@ -99,9 +99,13 @@
<dxe:DateEdit MaskType="DateTimeAdvancingCaret" AllowNullInput="True" Grid.Column="1" Grid.Row="0" Margin="3" Width="125" Height="23" EditValue="{Binding Path=GueltigVon, UpdateSourceTrigger=PropertyChanged}" />
<dxe:DateEdit MaskType="DateTimeAdvancingCaret" AllowNullInput="True" Grid.Column="3" Grid.Row="0" Margin="3" Width="125" Height="23" EditValue="{Binding Path=GueltigBis, UpdateSourceTrigger=PropertyChanged}" />
<Button Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="2" Content="{markup:Translate Neuen Eintrag hinzufügen}" HorizontalAlignment="Left" Click="AddArbeitszeitToView_Click" Height="23" Margin="0,10,0,0" />
<StackPanel Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="5" Orientation="Horizontal">
<Button Content="{markup:Translate Neuen Eintrag hinzufügen}" HorizontalAlignment="Left" Click="AddArbeitszeitToView_Click" Height="23" Margin="0,10,0,0" />
<Button Grid.Row="1" Grid.Column="1" Grid.ColumnSpan="2" Content="{markup:Translate Gesamte Betreuungszeiten kopieren}" HorizontalAlignment="Left" Click="CopyArbeitszeit_Click" Height="23" Margin="10,10,0,0" />
<controls:PopupNonTopmost x:Name="popup_newArbeitszeitEintrag" Placement="MousePoint" StaysOpen="True">
</StackPanel>
<controls:PopupNonTopmost x:Name="popup_newArbeitszeitEintrag" Placement="MousePoint" StaysOpen="True">
<Border Background="White" Padding="3" BorderThickness="1" BorderBrush="Gray">
<GroupBox Name="groupbox_newArbeistzeit" Header="Neuen Eintrag hinzufügen" Style="{DynamicResource ObjectEditGroupBox}">
<Grid>
@@ -203,9 +207,10 @@
</dxg:GridColumn.EditTemplate>
</dxg:GridColumn>
<dxg:GridColumn Header="Bemerkungen" FieldName="Notice" />
</dxg:GridControl.Columns>
<dxg:GridColumn Header="" FieldName="Infos" AllowEditing="False" AllowSorting="False" Width="150"/>
</dxg:GridControl.Columns>
<dxg:GridControl.View>
<dxg:TableView NavigationStyle="Cell" Margin="2,2,2,2" AllowBestFit="True" BestFitMode="AllRows" AutoWidth="True" ShowGroupPanel="False" ShowGroupedColumns="False" ShowTotalSummary="False" HorizontalContentAlignment="Left" ShowingEditor="GridViewBase_OnShowingEditor" />
<dxg:TableView NavigationStyle="Cell" Margin="2,2,2,2" AllowBestFit="True" BestFitMode="AllRows" ShowGroupPanel="False" ShowGroupedColumns="False" ShowTotalSummary="False" HorizontalContentAlignment="Left" ShowingEditor="GridViewBase_OnShowingEditor" />
</dxg:GridControl.View>
</dxg:GridControl>
</GroupBox>

View File

@@ -11,6 +11,8 @@ using BS.Shared.Core;
using BS.Shared.DataContracts.Compact;
using DevExpress.Xpf.Grid;
using System;
using BS.Shared.DataContracts;
using System.Collections.Generic;
namespace BeWo.View
{
@@ -114,11 +116,11 @@ namespace BeWo.View
private void AddArbeitszeitToView_Click(object sender, RoutedEventArgs e)
{
var popup = tabcontrol_Arbeitszeit.GetAllChildren().OfType<PopupNonTopmost>();
var popup = tabcontrol_Arbeitszeit.GetAllChildren().OfType<PopupNonTopmost>();
var popup_NewArbeitszeitEintrag = popup.First(x => x.Name.Equals("popup_newArbeitszeitEintrag"));
var popup_NewArbeitszeitEintrag = popup.First(x => x.Name.Equals("popup_newArbeitszeitEintrag"));
popup_NewArbeitszeitEintrag.IsOpen = true;
popup_NewArbeitszeitEintrag.IsOpen = true;
}
private void PopupArbeitszeitClose_Click(object sender, RoutedEventArgs e)
@@ -163,6 +165,33 @@ namespace BeWo.View
grid_ArbeitszeitEintrag.RefreshData();
}
private void CopyArbeitszeit_Click(object sender, RoutedEventArgs e)
{
var arbeitszeit = tabcontrol_Arbeitszeit.SelectedItem as ArbeitszeitVM;
var dc = new ArbeitszeitDC();
if (arbeitszeit.GueltigBis.HasValue)
{
dc.GueltigVon = arbeitszeit.GueltigBis.Value.AddDays(1);
}
dc.Eintraege = new List<ArbeitszeitEintragDC>();
foreach (var ae in arbeitszeit.ArbeitszeitEintraege.VMList)
{
var copy = new ArbeitszeitEintragDC();
copy.Tag = ae.Tag;
copy.UhrzeitVon = ae.UhrzeitVon;
copy.UhrzeitBis = ae.UhrzeitBis;
copy.Notice = ae.Notice;
copy.Employee = ae.Employee;
dc.Eintraege.Add(copy);
}
var copyVm = new ArbeitszeitVM(dc);
ViewModel.VMList.Add(copyVm);
tabcontrol_Arbeitszeit.SelectedIndex = tabcontrol_Arbeitszeit.Items.Count - 1;
}
private void GridControl_OnCustomColumnSort(object sender, CustomColumnSortEventArgs e)
{
var comparer = new WochentagComparerClass();

View File

@@ -2,6 +2,7 @@ using BS.Shared;
using BS.Shared.DataContracts;
using BeWo.Validation;
using BS.Shared.DataContracts.Compact;
using System;
namespace BeWo.ViewModel
{
@@ -49,6 +50,7 @@ namespace BeWo.ViewModel
_UhrzeitVon = value;
StoreDirtyInformation(AreDifferent(DataContract.UhrzeitVon, value), PropertyName_UhrzeitVon);
FirePropertyChanged(PropertyName_UhrzeitVon);
FirePropertyChanged("Infos");
}
}
}
@@ -64,7 +66,7 @@ namespace BeWo.ViewModel
{
_UhrzeitBis = value;
StoreDirtyInformation(AreDifferent(DataContract.UhrzeitBis, value), PropertyName_UhrzeitBis);
FirePropertyChanged(PropertyName_UhrzeitBis);
FirePropertyChanged("Infos");
}
}
}
@@ -101,6 +103,30 @@ namespace BeWo.ViewModel
}
}
public string Infos
{
get
{
if (!string.IsNullOrEmpty(UhrzeitVon) && !string.IsNullOrEmpty(UhrzeitVon))
{
String dateStr1 = String.Format("{0:dd.MM.yyyy} {1}", DateTime.Now, UhrzeitVon);
String dateStr2 = String.Format("{0:dd.MM.yyyy} {1}", DateTime.Now, UhrzeitBis);
DateTime date1;
DateTime date2;
if (DateTime.TryParse(dateStr1, out date1) && DateTime.TryParse(dateStr2, out date2))
{
return String.Format("Gesamtstunden: {0:0.00}", date2.Subtract(date1).TotalHours);
}
}
return "";
}
}
public string Klient => _CompactCustomer?.FullName;
public CompactCustomerDC CompactCustomer

View File

@@ -18,12 +18,6 @@ namespace BeWoDatabaseTerminator
{
internal class Program
{
private const string PubKeyX3 = "3082010A02820101009CD30CF05AE52E47B7725D3783B3686330EAD735261925E1BDBE35F170922FB7B84B4105ABA99E350858ECB12AC468870BA3E375E4E6F3A76271BA7981601FD7919A9FF3D0786771C8690E9591CFFEE699E9603C48CC7ECA4D7712249D471B5AEBB9EC1E37001C9CAC7BA705EACE4AEBBD41E53698B9CBFD6D3C9668DF232A42900C867467C87FA59AB8526114133F65E98287CBDBFA0E56F68689F3853F9786AFB0DC1AEF6B0D95167DC42BA065B299043675806BAC4AF31B9049782FA2964F2A20252904C674C0D031CD8F31389516BAA833B843F1B11FC3307FA27931133D2D36F8E3FCF2336AB93931C5AFC48D0D1D641633AAFA8429B6D40BC0D87DC3930203010001";
private const string PubKeyR3 = "3082010A0282010100BB021528CCF6A094D30F12EC8D5592C3F882F199A67A4288A75D26AAB52BB9C54CB1AF8E6BF975C8A3D70F4794145535578C9EA8A23919F5823C42A94E6EF53BC32EDB8DC0B05CF35938E7EDCF69F05A0B1BBEC094242587FA3771B313E71CACE19BEFDBE43B45524596A9C153CE34C852EEB5AEED8FDE6070E2A554ABB66D0E97A540346B2BD3BC66EB66347CFA6B8B8F572999F830175DBA726FFB81C5ADD286583D17C7E709BBF12BF786DCC1DA715DD446E3CCAD25C188BC60677566B3F118F7A25CE653FF3A88B647A5FF1318EA9809773F9D53F9CF01E5F5A6701714AF63A4FF99B3939DDC53A706FE48851DA169AE2575BB13CC5203F5ED51A18BDB150203010001";
private const string PubKeyE1 = "04245C2DA22AFD1C4BA65D97732731ACB2A06962EF65E8A6B0F0AC4B9FFF1C0B700FD3982F4DFC0F009B37F074055732972E05EF2A4325A3FB6E342713F64F7E69D302995EEB244792C1249BE6B1218FC12481FC68CC1F69BA58F51922F774C616";
private const String PUB_KEY_R11 = "3082010A0282010100BA87BC5C1B0039CBCA0ACDD46710F9013CA54EA561CB26CA52FB1501B7B928F5281EED27B324183967090C08ECE03AB03B770EBDF3E53954410C4EAE41D69974DE51DBEF7BFF58BDA8B713F6DE31D5F272C9726A0B8374959C4600641499F3B1D922D9CDA892AA1C267A3FFEEF58057B089581DB710F8EFBE33109BB09BE504D5F8F91763D5A9D9E83F2E9C466B3E106664348188065A037189A9B843297B1B2BDC4F815009D2788FBE26317966C9B27674BC4DB285E69C279F0495CE02450E1C4BCA105AC7B406D00B4C2413FA758B82FC55C9BA5BB099EF1FEEBB08539FDA80AEF45C478EB652AC2CF5F3CDEE35C4D1BF70B272BAA0B4277534F796A1D87D90203010001";
private const String PUB_KEY_R10 = "3082010A0282010100CF57E5E6C45412EDB447FEC92758764650288C1D3E88DF059DD5B51829BDDDB55ABFFAF6CEA3BEAF00214B625A5A3C012FC55803F689FF8E1143EBC1B5E01407968F6F1FD7E7BA8139097565B7C2AF185B372628E7A3F4072B6D1AFFAB58BC95AE40FFE9CB57C4B55B7F780D1861BC17E754C6BB4991CD6E18D18085EEA66536BC74EABC504CEAFC21F338169394BAB0D36B3806CD16127ACA5275C8AD76B2C29C5D98455C6F617BC62DEE3C13528601D957E6381CDF8DB51F92919AE74A1CCC45A87255F0B0E6A307ECFDA71B669E3F488B71847158C93AFAEF5EF25B442B3C74E78FB247C1076ACD9AB70D96F712812651540AEC61F6F7F5E2F28AC8950D8D0203010001";
private const string APIKEY = "CwjlSCbNqctEsofpGY64Z4aO6pShNYAdGtjMqHsjO64FuK23qoRDUqIjUC0P";
private static string _ConnectionStringServer;
@@ -49,36 +43,57 @@ namespace BeWoDatabaseTerminator
ServicePointManager.ServerCertificateValidationCallback = PinPublicKey;
}
private const String PUB_KEY_X3 = "9CD30CF05AE52E47B7725D3783B3686330EAD735261925E1BDBE35F170922FB7B84B4105ABA99E350858ECB12AC468870BA3E375E4E6F3A76271BA7981601FD7919A9FF3D0786771C8690E9591CFFEE699E9603C48CC7ECA4D7712249D471B5AEBB9EC1E37001C9CAC7BA705EACE4AEBBD41E53698B9CBFD6D3C9668DF232A42900C867467C87FA59AB8526114133F65E98287CBDBFA0E56F68689F3853F9786AFB0DC1AEF6B0D95167DC42BA065B299043675806BAC4AF31B9049782FA2964F2A20252904C674C0D031CD8F31389516BAA833B843F1B11FC3307FA27931133D2D36F8E3FCF2336AB93931C5AFC48D0D1D641633AAFA8429B6D40BC0D87DC3930203010001";
private const String PUB_KEY_R3 = "BB021528CCF6A094D30F12EC8D5592C3F882F199A67A4288A75D26AAB52BB9C54CB1AF8E6BF975C8A3D70F4794145535578C9EA8A23919F5823C42A94E6EF53BC32EDB8DC0B05CF35938E7EDCF69F05A0B1BBEC094242587FA3771B313E71CACE19BEFDBE43B45524596A9C153CE34C852EEB5AEED8FDE6070E2A554ABB66D0E97A540346B2BD3BC66EB66347CFA6B8B8F572999F830175DBA726FFB81C5ADD286583D17C7E709BBF12BF786DCC1DA715DD446E3CCAD25C188BC60677566B3F118F7A25CE653FF3A88B647A5FF1318EA9809773F9D53F9CF01E5F5A6701714AF63A4FF99B3939DDC53A706FE48851DA169AE2575BB13CC5203F5ED51A18BDB150203010001";
private const String PUB_KEY_E1 = "245c2da22afd1c4ba65d97732731acb2a06962ef65e8a6b0f0ac4b9fff1c0b700fd3982f4dfc0f009b37f074055732972e05ef2a4325a3fb6e342713f64f7e69d302995eeb244792c1249be6b1218fc12481fc68cc1f69ba58f51922f774c616";
private const String PUB_KEY_E5 = "0d0b3a8a6b618eb6efdc5f58e7c6424554ab63f66661480a2e5975b481023750b73f1679dc98eca1289772201c2ccfd57c52204e54785b84146bc090ae85ecc051413c5a877f064dd4fe60d1fa6c2de17d951088a208540f991a4ce6ea0aacd8";
private const String PUB_KEY_E6 = "d9f19e4687f8217160a826eba3fab9eada1db912a7d426d95114b1617c7596bf220b391fd5bed10a46aa2d3c4a09842ebe409555e91940376675ed324e770449f8707bc318e7cef77110feac74d800d4ed6d1c731633109c3ab2ea6c62f4bdb8";
private const String PUB_KEY_R10 = "CF57E5E6C45412EDB447FEC92758764650288C1D3E88DF059DD5B51829BDDDB55ABFFAF6CEA3BEAF00214B625A5A3C012FC55803F689FF8E1143EBC1B5E01407968F6F1FD7E7BA8139097565B7C2AF185B372628E7A3F4072B6D1AFFAB58BC95AE40FFE9CB57C4B55B7F780D1861BC17E754C6BB4991CD6E18D18085EEA66536BC74EABC504CEAFC21F338169394BAB0D36B3806CD16127ACA5275C8AD76B2C29C5D98455C6F617BC62DEE3C13528601D957E6381CDF8DB51F92919AE74A1CCC45A87255F0B0E6A307ECFDA71B669E3F488B71847158C93AFAEF5EF25B442B3C74E78FB247C1076ACD9AB70D96F712812651540AEC61F6F7F5E2F28AC8950D8D0203010001";
private const String PUB_KEY_R11 = "BA87BC5C1B0039CBCA0ACDD46710F9013CA54EA561CB26CA52FB1501B7B928F5281EED27B324183967090C08ECE03AB03B770EBDF3E53954410C4EAE41D69974DE51DBEF7BFF58BDA8B713F6DE31D5F272C9726A0B8374959C4600641499F3B1D922D9CDA892AA1C267A3FFEEF58057B089581DB710F8EFBE33109BB09BE504D5F8F91763D5A9D9E83F2E9C466B3E106664348188065A037189A9B843297B1B2BDC4F815009D2788FBE26317966C9B27674BC4DB285E69C279F0495CE02450E1C4BCA105AC7B406D00B4C2413FA758B82FC55C9BA5BB099EF1FEEBB08539FDA80AEF45C478EB652AC2CF5F3CDEE35C4D1BF70B272BAA0B4277534F796A1D87D90203010001";
private static bool PinPublicKey(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslpolicyerrors)
{
try
{
if(certificate is null || chain is null)
{
if (certificate == null || chain == null)
return false;
}
var chainContainsPublicKey = false;
bool chainContainsPk = false;
foreach(var element in chain.ChainElements)
foreach (var element in chain.ChainElements)
{
var pk = element.Certificate.GetPublicKeyString();
if((pk?.Equals(PubKeyX3) ?? false) || (pk?.Equals(PubKeyR3) ?? false) || (pk?.Equals(PubKeyE1) ?? false) || pk == PUB_KEY_R11 || pk == PUB_KEY_R10)
String pk = element.Certificate.GetPublicKeyString().ToLower();
if (pk.Contains(PUB_KEY_X3.ToLower()) ||
pk.Contains(PUB_KEY_R3.ToLower()) ||
pk.Contains(PUB_KEY_E1.ToLower()) ||
pk.Contains(PUB_KEY_E5.ToLower()) ||
pk.Contains(PUB_KEY_E6.ToLower()) ||
pk.Contains(PUB_KEY_R10.ToLower()) ||
pk.Contains(PUB_KEY_R11.ToLower()))
{
chainContainsPublicKey = true;
chainContainsPk = true;
}
}
var subjectAccepted = certificate.Subject.Trim().ToLower().EndsWith(".bewoplaner.de") || certificate.Subject.Trim().ToLower().EndsWith(".ownchat.de");
return chainContainsPublicKey && subjectAccepted;
bool subjectAccepted = certificate.Subject.Trim().ToLower().EndsWith(".bewoplaner.de") ||
certificate.Subject.Trim().ToLower().EndsWith(".ownchat.de");
return chainContainsPk && subjectAccepted;
}
catch(Exception)
catch (Exception e)
{
return false;
}
}
private static async Task Main(string[] args)
{
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

View File

@@ -24,5 +24,6 @@
<property column="ChangeType" type="BS.Shared.StatementType, BS.Shared" name="ChangeType" />
<property name="SupportConcept_CustomerOid" type="Int64" />
<property name="SupportConcept_EmployeeOid" type="Int64" />
<property name="SupportConceptOid" type="Int64" />
</class>
</hibernate-mapping>

View File

@@ -102,6 +102,7 @@ namespace BeWo.Report.DefaultReports
this.xrTableCell57 = new DevExpress.XtraReports.UI.XRTableCell();
this.xrTableCell58 = new DevExpress.XtraReports.UI.XRTableCell();
this.xrTableCell26 = new DevExpress.XtraReports.UI.XRTableCell();
this.bindingSource1 = new System.Windows.Forms.BindingSource(this.components);
this.Title = new DevExpress.XtraReports.UI.XRControlStyle();
this.FieldCaption = new DevExpress.XtraReports.UI.XRControlStyle();
this.PageInfo = new DevExpress.XtraReports.UI.XRControlStyle();
@@ -120,7 +121,6 @@ namespace BeWo.Report.DefaultReports
this.fieldIstArbeitszeit = new DevExpress.XtraReports.UI.CalculatedField();
this.fieldUeberstundenGesamt = new DevExpress.XtraReports.UI.CalculatedField();
this.fieldTatsSoll = new DevExpress.XtraReports.UI.CalculatedField();
this.bindingSource1 = new System.Windows.Forms.BindingSource(this.components);
((System.ComponentModel.ISupportInitialize)(this.xrTableDetail)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.xrTableHeader)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.xrTable2)).BeginInit();
@@ -808,7 +808,7 @@ namespace BeWo.Report.DefaultReports
this.xrTableCell51.StylePriority.UseFont = false;
this.xrTableCell51.StylePriority.UsePadding = false;
this.xrTableCell51.StylePriority.UseTextAlignment = false;
this.xrTableCell51.Text = "davon ausbezahlt:";
this.xrTableCell51.Text = "Anpassung Überstunden:";
this.xrTableCell51.TextAlignment = DevExpress.XtraPrinting.TextAlignment.MiddleRight;
this.xrTableCell51.Weight = 0.22133303497678214D;
//
@@ -891,6 +891,10 @@ namespace BeWo.Report.DefaultReports
this.xrTableCell26.TextAlignment = DevExpress.XtraPrinting.TextAlignment.MiddleRight;
this.xrTableCell26.Weight = 0.11143081848591821D;
//
// bindingSource1
//
this.bindingSource1.DataSource = typeof(BeWo.Report.ReportObjects.MitarbeiterstundenkontoRO);
//
// Title
//
this.Title.BackColor = System.Drawing.Color.White;
@@ -1027,10 +1031,6 @@ namespace BeWo.Report.DefaultReports
this.fieldTatsSoll.FieldType = DevExpress.XtraReports.UI.FieldType.Decimal;
this.fieldTatsSoll.Name = "fieldTatsSoll";
//
// bindingSource1
//
this.bindingSource1.DataSource = typeof(BeWo.Report.ReportObjects.MitarbeiterstundenkontoRO);
//
// Mitarbeiterarbeitszeitkonto
//
this.Bands.AddRange(new DevExpress.XtraReports.UI.Band[] {

View File

@@ -1719,7 +1719,7 @@ namespace BeWo.Report.ReportObjects
{
if (dd.Feiertag != null)
{
dd.MinutesTotal = dd.SollStunden * 60;
dd.MinutesTotal = dd.SollStunden * 60 * GetFeiertagsFaktor(dd.Date);
TimeSpan tspan = TimeSpan.FromMinutes((double)dd.MinutesTotal);
dd.TimeTotal = String.Format("{0:00}:{1:00}", tspan.Hours, tspan.Minutes);
}

View File

@@ -578,17 +578,18 @@ where scap2e.EmployeeOid = {0} and scap.Start <= '{1:yyyy-MM-dd}' and scap.EndDa
foreach (AbsenceTime at in c.AbsenceTimes.OrderBy(a => a.Start))
{
if (at.AbsenceReason.Description.Contains("<24h") || at.AbsenceReason.Description.Contains(">24h") || at.AbsenceReason.Description.StartsWith("S_Abwesenheit nicht abrechenbar") || at.AbsenceReason.Description.StartsWith("S_JA"))
if (at.AbsenceReason.Description.Contains("<24h") || at.AbsenceReason.Description.Contains(">24h") || at.AbsenceReason.Description.Contains("Abwesenheit nicht abrechenbar") || at.AbsenceReason.Description.StartsWith("S_JA") ||
at.AbsenceReason.Description.StartsWith("SozA") || at.AbsenceReason.Description.StartsWith("S_Abwesenheit nicht abrechenbar") || at.AbsenceReason.Description.StartsWith("JugA"))
{
if (at.Start >= startSchuljahr && at.Start <= endeSchuljahr && (at.End == null || at.End >= startSchuljahr))
{
var maxAnzahlIntern = maxAnzahl;
if (at.AbsenceReason.Description.Contains("<24h_SA"))
if (at.AbsenceReason.Description.Contains("<24h_SA") || at.AbsenceReason.Description.Contains("unter 24"))
{
maxAnzahlIntern = Int32.MaxValue; // Dürfen immer abgerechnet werden
}
else if ((at.AbsenceReason.Description.Contains(">24h") && istJugendamt) || at.AbsenceReason.Description.StartsWith("S_Abwesenheit nicht abrechenbar"))
else if ((at.AbsenceReason.Description.Contains(">24h") && istJugendamt) || at.AbsenceReason.Description.Contains("Abwesenheit nicht abrechenbar"))
{
maxAnzahlIntern = 0; // Darf beim Jugendamt nie abgerechnet werden
}

View File

@@ -12,25 +12,13 @@ namespace BeWo.Service.Invoicing
{
internal class Club74SettlementInvoiceCreation : LWLSettlementInvoiceCreation
{
private decimal totalFLS = 0;
public override List<InvoiceItemDC> CreateInvoiceItems(Settlement2DC si, IList<ApprovalPeriod> apList)
{
var items = base.CreateInvoiceItems(si, apList, true);
var temp = base.CreateInvoiceItems(si, apList, false);
totalFLS = temp.Sum(ii => (ii.UnitCount ?? 0)); // * rf; //eigentlich falsch dass netto = brutto ist.
return items;
}
public override bool SchneideBeiErreichenDesBudgetsAb { get { return true; } }
public override void CreateInvoiceDetailsTheOldWay(Settlement2DC si, CostBearer2SupportConcept c2s)
{
base.CreateInvoiceDetailsTheOldWay(si, c2s);
si.RecordedBillableFLSNetto = totalFLS;
si.RecordedBillableFLSNetto = si.RecordedMinutesTotal / 60;
}
}
}

View File

@@ -18,7 +18,7 @@ namespace DieBrueckeHilfeUndHalt.Service
var stats = base.CreateSupportConceptStatisticsImpl(costBearer2SupportConceptOid, statisticsDate, ignoreServiceRecordOid);
var cb = MapperFactory.SupportConceptCostBearerRelDC_CostBearer2SupportConcept.MapToNewDC(DAOFactory.GenericDAO.GetByID<CostBearer2SupportConcept>(costBearer2SupportConceptOid));
if (!cb.CostBearer.Function.ToLower().Contains("neue vereinbarung"))
if (cb == null || cb.CostBearer.Function == null || !cb.CostBearer.Function.ToLower().Contains("neue vereinbarung"))
return stats;
decimal factor = 1.2m;

View File

@@ -132,7 +132,8 @@ namespace Fortis
if (ro.MinutenProWocheUnterStufe < 0)
{
ro.Hinweise = "Vorsicht: Rückforderung droht!";
//ro.Hinweise = "Vorsicht: Rückforderung droht!";
ro.Hinweise = "";
}

View File

@@ -0,0 +1,22 @@
using System;
using System.Collections.Generic;
using BeWo.Service.Plugins;
using BS.Shared.Core;
using BS.Shared.DataContracts;
using BS.Shared.Services;
namespace HphBersenbrueck
{
public class CustomGroupDurationCalculator : GroupDurationCalculator
{
public override GroupDurationDC CalculateGroupDuration(int personCount, int employeeCount, decimal totalDuration)
{
return new GroupDurationDC()
{
SingleDuration = Math.Round((totalDuration / personCount) * employeeCount, 2, MidpointRounding.AwayFromZero),
TotalDuration = totalDuration
};
}
}
}

View File

@@ -64,6 +64,7 @@
<Reference Include="WindowsBase" />
</ItemGroup>
<ItemGroup>
<Compile Include="Calculations\CustomGroupDurationCalculator.cs" />
<Compile Include="Calculations\HPHBCalculations.cs" />
<Compile Include="CustomerDataReport.cs">
<SubType>Component</SubType>

View File

@@ -19,7 +19,7 @@ namespace HPHBersenbrueck.Invoicing
{
protected DateTime? accountingPeriodStart = null;
protected DateTime? accountingPeriodEnd = null;
private Dictionary<long, bool> groupOidDict = null;
public override void SetInvoiceId(ServiceInvoice invoice)
{
@@ -29,6 +29,8 @@ namespace HPHBersenbrueck.Invoicing
public override List<ServiceInvoiceDC> GenerateServiceInvoices(long costBearerOid, DateTimeSpan invoicePeriod, Dictionary<CompactSupportConceptDC, List<ServiceRecordDC>> supportConcepts2ServiceRecords)
{
groupOidDict = new Dictionary<long, bool>();
var invoices = base.GenerateServiceInvoices(costBearerOid, invoicePeriod, supportConcepts2ServiceRecords);
foreach (var i in invoices)
@@ -65,14 +67,27 @@ namespace HPHBersenbrueck.Invoicing
{
return null;
}
var ii = base.CreateInvoiceItem(iServiceRecord, scap, calc);
ii.ItemDescription = iServiceRecord.ServiceDescription.CategoryName;
if (ii.ItemDescription.StartsWith("Neu "))
if (!iServiceRecord.GroupOid.HasValue || !groupOidDict.ContainsKey(iServiceRecord.GroupOid.Value))
{
ii.ItemDescription = ii.ItemDescription.Replace("Neu ", "");
var ii = base.CreateInvoiceItem(iServiceRecord, scap, calc);
if (iServiceRecord.GroupOid.HasValue)
{
ii.UnitCount = ((iServiceRecord.GroupRoundedDuration / iServiceRecord.GroupPersonCount) * iServiceRecord.GroupEmployeeCount) / 60;
}
ii.UnitCount = Math.Round(ii.UnitCount.Value * 1.2m, 2, MidpointRounding.AwayFromZero);
ii.ItemDescription = iServiceRecord.ServiceDescription.CategoryName;
if (ii.ItemDescription.StartsWith("Neu "))
{
ii.ItemDescription = ii.ItemDescription.Replace("Neu ", "");
}
if (iServiceRecord.GroupOid.HasValue)
{
groupOidDict.Add(iServiceRecord.GroupOid.Value, true);
}
return ii;
}
return ii;
return null;
}
public override IList<InvoiceItem> CreateInvoiceItems(List<ServiceRecordDC> serviceRecordsInPeriod, DateTimeSpan invoicePeriod, SupportConceptApprovalPeriod scap, BS.Shared.Services.Calculations calc)
@@ -83,7 +98,7 @@ namespace HPHBersenbrueck.Invoicing
{
if (item.UnitCount.HasValue)
{
item.UnitCount = Math.Round(item.UnitCount.Value * 1.2m, 2, MidpointRounding.AwayFromZero);
item.AmountTotal = item.AmountPerUnit * item.UnitCount;
item.GrossAmountTotal = item.AmountTotal;

View File

@@ -47,32 +47,44 @@ namespace BeWo.HPHBersenbrueck
List<ServicesOverviewRO.ServiceDetail> servicesBillable = new List<ServicesOverviewRO.ServiceDetail>();
int summeWegepauschalen = 0;
int summeAusfallstunden = 0;
decimal summeAbrWegePauschalen = 0;
foreach (var sd in pRO.Services)
{
if (!sd.ServiceCategory.Contains("Fahrt"))
{
sd.FLSQualified = sd.Minutes / 50;
minuten += sd.Minutes;
ServicesOverviewRO.CreateSignatureString(sd);
sd.FLSQualified = sd.Minutes / 50;
if (sd.IsGroup)
{
//sd.Notice5 = String.Format("{0} Teilnehmer", sd.CustomerCount);
hatGruppen = true;
sd.Notice3 = "1";
sd.Minutes = sd.GroupMinutes;
sd.FLSQualified = Math.Round((sd.GroupMinutes / sd.CustomerCount / 50) * sd.EmployeeCount, 2, MidpointRounding.AwayFromZero);
}
else
sd.Notice3 = "";
{
sd.FLSQualified = sd.Minutes / 50;
}
minuten += sd.Minutes;
// Felder für Wegepauschale setzen (Wenn FLS FaceToFace, dann ja)
sd.Notice3 = "";
sd.Notice4 = "";
if (!String.IsNullOrWhiteSpace(sd.GefahreneKilometer) && Decimal.TryParse(sd.GefahreneKilometer, out var k))
{
if (k > 0)
{
sd.Notice4 = "1";
sd.Notice3 = "1";
sd.Notice4 = String.Format("{0:0.00}", 1m / sd.CustomerCount);
summeAbrWegePauschalen += Math.Round(1m / sd.CustomerCount, 2, MidpointRounding.AwayFromZero);
summeWegepauschalen++;
}
}
@@ -92,6 +104,7 @@ namespace BeWo.HPHBersenbrueck
pRO.Services = servicesBillable;
lblSummeWegepauschalen.Text = string.Format("{0:0}", summeWegepauschalen);
lblSummeAusfallstunden.Text = string.Format("{0:0}", summeAusfallstunden);
lblSummeAbrWegepauschalen.Text = string.Format("{0:0.00}", summeAbrWegePauschalen);
}
lblBewilligtFls.Text = String.Format("{0:0.00}", pRO.ApprovedFLSPerWeek);

View File

@@ -47,35 +47,44 @@ namespace BeWo.HPHBersenbrueck
List<ServicesOverviewRO.ServiceDetail> servicesBillable = new List<ServicesOverviewRO.ServiceDetail>();
int summeWegepauschalen = 0;
int summeAusfallstunden = 0;
decimal summeAbrWegePauschalen = 0;
foreach (var sd in pRO.Services)
{
sd.IsBillable = sd.ServiceDescription.Contains("50 direkt") || sd.ServiceDescription.Contains("Ausfall");
if (sd.IsBillable && !sd.ServiceCategory.Contains("Fahrt"))
{
sd.FLSQualified = sd.Minutes / 50;
minuten += sd.Minutes;
ServicesOverviewRO.CreateSignatureString(sd);
if (sd.IsGroup)
{
//sd.Notice5 = String.Format("{0} Teilnehmer", sd.CustomerCount);
hatGruppen = true;
sd.Notice3 = "1";
sd.Minutes = sd.GroupMinutes;
sd.FLSQualified = Math.Round((sd.GroupMinutes / sd.CustomerCount / 50) * sd.EmployeeCount, 2, MidpointRounding.AwayFromZero);
}
else
sd.Notice3 = "";
{
sd.FLSQualified = sd.Minutes / 50;
}
minuten += sd.Minutes;
// Felder für Wegepauschale setzen (Wenn FLS FaceToFace, dann ja)
sd.Notice3 = "";
sd.Notice4 = "";
if (!String.IsNullOrWhiteSpace(sd.GefahreneKilometer) && Decimal.TryParse(sd.GefahreneKilometer, out var k))
{
if (k > 0)
{
sd.Notice4 = "1";
sd.Notice3 = "1";
sd.Notice4 = String.Format("{0:0.00}", 1m / sd.CustomerCount);
summeAbrWegePauschalen += Math.Round(1m / sd.CustomerCount, 2, MidpointRounding.AwayFromZero);
summeWegepauschalen++;
}
}
@@ -95,6 +104,7 @@ namespace BeWo.HPHBersenbrueck
pRO.Services = servicesBillable;
lblSummeWegepauschalen.Text = string.Format("{0:0}", summeWegepauschalen);
lblSummeAusfallstunden.Text = string.Format("{0:0}", summeAusfallstunden);
lblSummeAbrWegepauschalen.Text = string.Format("{0:0.00}", summeAbrWegePauschalen);
}
lblBewilligtFls.Text = String.Format("{0:0.00}", pRO.ApprovedFLSPerWeek);

View File

@@ -56,11 +56,12 @@ namespace HphBersenbrueck.Service
if (stats != null)
{
var allStats = new List<SupportConceptPeriodStatisticsDC>();
foreach (var pdc in stats.PeriodStatistics.OrderByDescending(s => s.SupportConceptApprovalPeriod != null ? s.SupportConceptApprovalPeriod.StartDate : DateTime.MinValue))
{
if (pdc.SupportConceptApprovalPeriod != null && pdc.SupportConceptApprovalPeriod.ServiceCategory != null && pdc.SupportConceptApprovalPeriod.ServiceCategory.Name == NEUE_QA_KATEGORIE)
{
ErstelleAlleStatistikenFuerNeueQA(statisticsDate, dc, stats, pdc);
BerechneAlleStatistikenFuerNeueQA(statisticsDate, dc, stats, pdc, allStats);
}
else
{
@@ -88,14 +89,18 @@ namespace HphBersenbrueck.Service
}
dc.PeriodStatisticInfos.Add(CreateServiceRecordPeriodStatisticsInfo(stats, pdc, header));
}
}
if (allStats.Count > 0)
{
ErstelleStatistikenFuerDieAnzeige(dc, stats, allStats);
}
}
return dc;
}
private void ErstelleAlleStatistikenFuerNeueQA(DateTime statisticsDate, ServiceRecordStatisticsInfoDC dc, SupportConceptStatisticsDC stats, SupportConceptPeriodStatisticsDC pdc)
private void BerechneAlleStatistikenFuerNeueQA(DateTime statisticsDate, ServiceRecordStatisticsInfoDC dc, SupportConceptStatisticsDC stats, SupportConceptPeriodStatisticsDC pdc, List<SupportConceptPeriodStatisticsDC> allStats)
{
//Eine Stunden der neuen QA wird unterteilt in 50 Min direkt, 10 Min Mittelbar, 6 Min indirekt und 15 Min Fahrtzeit
var statsDirekt = new SupportConceptPeriodStatisticsDC();
@@ -108,6 +113,8 @@ namespace HphBersenbrueck.Service
statsDirekt.ApprovedMinutesTillNow = pdc.ApprovedMinutesTillNow; // / 1.2m;
statsDirekt.SupportConceptApprovalPeriod = pdc.SupportConceptApprovalPeriod;
//statsMittelbar.MinutesApprovedPerWeek = pdc.MinutesApprovedPerWeek / 6m; //60 min. bewilligt sind 10 min. mittelbar
//statsMittelbar.MinutesApprovedTotal = pdc.MinutesApprovedTotal / 6m;
//statsMittelbar.ApprovedMinutesTillNow = pdc.ApprovedMinutesTillNow / 6m;
@@ -128,15 +135,47 @@ namespace HphBersenbrueck.Service
BerechneGeleisteteStunden(statisticsDate, statsIndirekt, "6 indirekte Leistung");
BerechneGeleisteteStunden(statisticsDate, statsFahrtzeit, "15 Fahrzeit");
String zeitraum = "";
if (stats.PeriodStatistics.Count > 1 && pdc.SupportConceptApprovalPeriod != null)
if (allStats.Count >= 3)
{
zeitraum = String.Format(" ({0:dd.MM.yyyy} - {1:dd.MM.yyyy})", pdc.SupportConceptApprovalPeriod.StartDate, pdc.SupportConceptApprovalPeriod.EndDate);
//Addiere Stunden der letzten Bewilligung auf die aktuelle Bewilligung
var letzteDirekt = allStats[0];
var letzteIndirekt = allStats[1];
var letzteFahrtzeit = allStats[2];
letzteDirekt.MinutesApprovedTotal += statsDirekt.MinutesApprovedTotal;
letzteDirekt.MinutesProvidedTotalRounded += statsDirekt.MinutesProvidedTotalRounded;
}
dc.PeriodStatisticInfos.Add(CreateServiceRecordPeriodStatisticsInfo(stats, statsDirekt, " 50 direkte Leistung" + zeitraum));
//dc.PeriodStatisticInfos.Add(CreateServiceRecordPeriodStatisticsInfo(stats, statsMittelbar, " 10 direkte Leistung"));
dc.PeriodStatisticInfos.Add(CreateServiceRecordPeriodStatisticsInfo(stats, statsIndirekt, " 6 indirekte Leistung"));
dc.PeriodStatisticInfos.Add(CreateServiceRecordPeriodStatisticsInfo(stats, statsFahrtzeit, " 15 Fahrzeit "));
allStats.Add(statsDirekt);
allStats.Add(statsIndirekt);
allStats.Add(statsFahrtzeit);
}
private void ErstelleStatistikenFuerDieAnzeige(ServiceRecordStatisticsInfoDC dc, SupportConceptStatisticsDC stats, List<SupportConceptPeriodStatisticsDC> allStats)
{
for (int i = 0; i < allStats.Count; i += 3)
{
var statsDirekt = allStats[i];
var statsIndirekt = allStats[i + 1];
var statsFahrtzeit = allStats[i + 2];
String zeitraum = "";
if (allStats.Count > 3 && statsDirekt.SupportConceptApprovalPeriod != null)
{
zeitraum = String.Format(" ({0:dd.MM.yyyy} - {1:dd.MM.yyyy})", statsDirekt.SupportConceptApprovalPeriod.StartDate, statsDirekt.SupportConceptApprovalPeriod.EndDate);
}
dc.PeriodStatisticInfos.Add(CreateServiceRecordPeriodStatisticsInfo(stats, statsDirekt, " 50 direkte Leistung" + zeitraum));
//dc.PeriodStatisticInfos.Add(CreateServiceRecordPeriodStatisticsInfo(stats, statsMittelbar, " 10 direkte Leistung"));
dc.PeriodStatisticInfos.Add(CreateServiceRecordPeriodStatisticsInfo(stats, statsIndirekt, " 6 indirekte Leistung"));
dc.PeriodStatisticInfos.Add(CreateServiceRecordPeriodStatisticsInfo(stats, statsFahrtzeit, " 15 Fahrzeit "));
}
}
private void BerechneGeleisteteStunden(DateTime statisticsDate, SupportConceptPeriodStatisticsDC pdc, string leistung)

View File

@@ -565,7 +565,7 @@ namespace LebenshilfeFrankfurtOder
{
var invoices4 = CreateAbrechnungSbdPool(start, start.AddMonths(1).AddTicks(-1), customerOid, serviceCategoryOid);
invoices.AddRange(invoices4);
}
}
}
else if (abrechnungsArt == AbrechnungsEnum.Einzelfallhilfe)
{
@@ -1325,7 +1325,17 @@ namespace LebenshilfeFrankfurtOder
{
var invoicePeriod = new DateTimeSpan(start, end);
IList<CompactSupportConceptDC> supportConcepts = GetSupportConcepts(start, end, "Familienentlastender Dienst", "pool", customerOid, 24);
long? regionOid = null;
if (serviceCategoryOid == 77)
{
regionOid = 24;
}
else
{
regionOid = 28;
}
IList<CompactSupportConceptDC> supportConcepts = GetSupportConcepts(start, end, "Familienentlastender Dienst", "pool", customerOid, regionOid);
var supportConcepts2ServiceRecords = new Dictionary<CompactSupportConceptDC, List<ServiceRecordDC>>();

View File

@@ -246,5 +246,18 @@ namespace SHKService
{
return true;
}
public override decimal GetFeiertagsFaktor(DateTime start)
{
if (start.Month == 12)
{
if (start.Day == 24 || start.Day == 31)
{
return 0.5m;
}
}
return base.GetFeiertagsFaktor(start);
}
}
}

View File

@@ -133,6 +133,7 @@
</Compile>
<Compile Include="Service\CustomCustomerService.cs" />
<Compile Include="Service\CustomSupportConceptAnalysisCreator.cs" />
<Compile Include="Service\CustomVacationService.cs" />
<Compile Include="Teamstundenkonto.cs">
<SubType>Component</SubType>
</Compile>

View File

@@ -0,0 +1,30 @@
using BeWo.Data.Access;
using BeWo.Data.Entities;
using BeWo.Service.Plugins;
using BS.Shared;
using BS.Shared.DataContracts;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
namespace SHKServiceSBD.Service
{
public class CustomVacationService : VacationService
{
public override List<FeiertagDC> GetFeiertage(int year, String bundesland)
{
List<FeiertagDC> list = base.GetFeiertage(year, bundesland);
if (year >= 2024)
{
list.Add(new FeiertagDC { Datum = new DateTime(year, 12, 31), Name = "Silvester" });
}
return list;
}
}
}

View File

@@ -375,7 +375,7 @@ namespace SHKServiceSBD
var faktor = GetFeiertagsFaktor(dd.Date);
if (faktor > 0)
{
if (at.AbsenceReason.Description.ToLower().Contains("krankengeld") || at.AbsenceReason.Description.ToLower().Contains("krank ohne lohnfortzahlung"))
if (at.AbsenceReason.Description.ToLower().Contains("krankengeld") || at.AbsenceReason.Description.ToLower().Contains("elternzeit") || at.AbsenceReason.Description.ToLower().Contains("krank ohne lohnfortzahlung"))
{
feiertagAnrechnen = false;
dd.HoursSick = sollProTag;
@@ -429,6 +429,7 @@ namespace SHKServiceSBD
if (feiertagAnrechnen && HatVertrag(ed, dd.Date))
{
var soll = BerechneSollAmTag(ed, dd.Date) * 60;
soll *= GetFeiertagsFaktor(dd.Date);
if (dd.MinutesTotal <= soll)
{
dd.MinutesTotal = soll;
@@ -565,7 +566,7 @@ namespace SHKServiceSBD
{
foreach (var at in emp.AbsenceTimes)
{
if (at.AbsenceReason.Description.ToLower().Contains("unbezahlter urlaub") || at.AbsenceReason.Description.ToLower().Contains("krankengeld"))
if (at.AbsenceReason.Description.ToLower().Contains("unbezahlter urlaub") || at.AbsenceReason.Description.ToLower().Contains("krankengeld") || at.AbsenceReason.Description.ToLower().Contains("elternzeit"))
{
if (at.Start.Value <= start && (!at.End.HasValue || at.End.Value >= start))
{
@@ -636,6 +637,13 @@ namespace SHKServiceSBD
//{
// return 1;
//}
if (start.Month == 12)
{
if (start.Day == 24 || start.Day == 31)
{
return 0.5m;
}
}
return base.GetFeiertagsFaktor(start);
}
@@ -649,5 +657,6 @@ namespace SHKServiceSBD
{
return vacationService.GetFerien(start, vacationService.Bundesland);
}
}
}

View File

@@ -66,7 +66,8 @@ namespace SHKServiceSBD
}
if (dd.AbsenceTimes != null && dd.AbsenceTimes.Count > 0 &&
(dd.AbsenceTimes[0].AbsenceReason.Description.Contains("Krankengeld") ||
(dd.AbsenceTimes[0].AbsenceReason.Description.Contains("Krankengeld") ||
dd.AbsenceTimes[0].AbsenceReason.Description.Contains("Elternzeit") ||
dd.AbsenceTimes[0].AbsenceReason.Description.Contains("ohne Lohnfortzahlung")))
{
ed.StundenSollMax -= dd.HoursSick;

View File

@@ -117,6 +117,7 @@
</Compile>
<Compile Include="Service\CustomCustomerService.cs" />
<Compile Include="Service\CustomOperationService.cs" />
<Compile Include="Service\CustomVacationService.cs" />
<Compile Include="Service\CustomVertretungsManager.cs" />
</ItemGroup>
<ItemGroup>

View File

@@ -0,0 +1,30 @@
using BeWo.Data.Access;
using BeWo.Data.Entities;
using BeWo.Service.Plugins;
using BS.Shared;
using BS.Shared.DataContracts;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
namespace SHKServiceSBD.Service
{
public class CustomVacationService : VacationService
{
public override List<FeiertagDC> GetFeiertage(int year, String bundesland)
{
List<FeiertagDC> list = base.GetFeiertage(year, bundesland);
if (year >= 2024)
{
list.Add(new FeiertagDC { Datum = new DateTime(year, 12, 31), Name = "Silvester" });
}
return list;
}
}
}

View File

@@ -15,6 +15,16 @@ namespace VSDHammReports
internal class CustomSettlementInvoiceCreation : LWLSettlementInvoiceCreation
{
public override bool SchneideBeiErreichenDesBudgetsAb { get { return true; } }
public override void CreateInvoiceDetailsTheOldWay(Settlement2DC si, CostBearer2SupportConcept c2s)
{
base.CreateInvoiceDetailsTheOldWay(si, c2s);
}
public override List<InvoiceItemDC> CreateInvoiceItems(Settlement2DC si, IList<ApprovalPeriod> apList, bool schneideBeiMaxAb)
{
//var items = base.CreateInvoiceItems(si, apList, true);
@@ -44,8 +54,6 @@ namespace VSDHammReports
list.Add(ap);
}
decimal maxApprovedFls = si.ApprovedFLS ?? 0;
decimal totalHours = 0;
foreach (var key in apsByHourlyRate.Keys)
{
IList<ApprovalPeriod> list = apsByHourlyRate[key];
@@ -64,6 +72,7 @@ namespace VSDHammReports
{
minutesTotal += approvalPeriod.RecordedMinutes;
minutesTotalBudget += approvalPeriod.BudgetMinutes;
if (approvalPeriod.PeriodStartDate < start)
start = approvalPeriod.PeriodStartDate;
if (approvalPeriod.PeriodEndDate > end)
@@ -92,22 +101,6 @@ namespace VSDHammReports
hoursBudget *= (100 + rf) / 100;
hoursBudget = Math.Round(hoursBudget, 2, MidpointRounding.AwayFromZero);
if (schneideBeiMaxAb)
{
if (totalHours + hoursBudget > maxApprovedFls)
{
hoursBudget = maxApprovedFls - totalHours;
if (hoursBudget < 0)
{
hoursBudget = 0;
}
if (hours > hoursBudget)
{
hours = hoursBudget;
}
}
}
totalHours += hoursBudget;
ii.UnitCount = hours;
ii.UnitCountBudget = hoursBudget;

View File

@@ -39,7 +39,7 @@ namespace BeWo.Service.Import.AvisImport
while (index < lines.Length)
{
var datumTa = LvrAvisTextAbschnitt.LeseBisDatum(lines, index, false);
var datumTa = LvrAvisTextAbschnittReader.LeseBisDatum(lines, index, false);
if (datumTa.Success)
{
index = datumTa.ZeilenIndex;
@@ -47,7 +47,7 @@ namespace BeWo.Service.Import.AvisImport
StringBuilder textBereich = new StringBuilder();
var monatTa = LvrAvisTextAbschnitt.LeseBisText(lines, index, "Monat:");
var monatTa = LvrAvisTextAbschnittReader.LeseBisText(lines, index, "Monat:");
if (monatTa.Success)
{
textBereich.Append(monatTa.Text);
@@ -79,11 +79,11 @@ namespace BeWo.Service.Import.AvisImport
int index = 0;
var ta = LvrAvisTextAbschnitt.LeseBisText(lines, index, Aktenzeichen);
var ta = LvrAvisTextAbschnittReader.LeseBisText(lines, index, Aktenzeichen);
index = ta.ZeilenIndex;
//Prüfe ob zuerst der Sachbearbeiter oder der Klientenname im Text steht. Der Sachbearbeiter beginnt mit dem Text "Sachbearbeiter:", der Klient endet mit dem Text "Aktenzeichen"
var sbTest = LvrAvisTextAbschnitt.LeseBisText(lines, index, "Sachbearbeiter");
var azTest = LvrAvisTextAbschnitt.LeseBisText(lines, index, "Aktenzeichen");
var sbTest = LvrAvisTextAbschnittReader.LeseBisText(lines, index, "Sachbearbeiter");
var azTest = LvrAvisTextAbschnittReader.LeseBisText(lines, index, "Aktenzeichen");
if (sbTest.Success && azTest.Success)
{
@@ -96,7 +96,7 @@ namespace BeWo.Service.Import.AvisImport
klientenZeile = azTest.Text;
//Sachbearbeiter steht hinter Klient
ta = LvrAvisTextAbschnitt.LeseBisDatum(lines, index, false);
ta = LvrAvisTextAbschnittReader.LeseBisDatum(lines, index, false);
sbZeile = ta.Text;
}
else
@@ -104,7 +104,7 @@ namespace BeWo.Service.Import.AvisImport
index = sbTest.ZeilenIndex + 1;
sbZeile = sbTest.Text;
//Suche Klient hinter Sachbearbeiter
ta = LvrAvisTextAbschnitt.LeseBisDatum(lines, index, false);
ta = LvrAvisTextAbschnittReader.LeseBisDatum(lines, index, false);
klientenZeile = ta.Text;
}

View File

@@ -39,9 +39,9 @@ namespace BeWo.Service.Import.AvisImport
//Suche Rechnungspositionen anhand des Euro Zeichens
//Prüfe ob ein neues Datum, eine Rechnungsposition oder die Gesamtsumme als nächstes kommt
var datumTa = LvrAvisTextAbschnitt.LeseBisDatum(lines, index, true);
var betragTa = LvrAvisTextAbschnitt.LeseBisText(lines, datumTa.ZeilenIndex, "€");
var gesamtTa = LvrAvisTextAbschnitt.LeseBisText(lines, betragTa.ZeilenIndex, "Gesamtsumme");
var datumTa = LvrAvisTextAbschnittReader.LeseBisDatum(lines, index, true);
var betragTa = LvrAvisTextAbschnittReader.LeseBisText(lines, datumTa.ZeilenIndex, "€");
var gesamtTa = LvrAvisTextAbschnittReader.LeseBisText(lines, betragTa.ZeilenIndex, "Gesamtsumme");
if (datumTa.Success)
{
@@ -54,7 +54,7 @@ namespace BeWo.Service.Import.AvisImport
while (betragTa.Success && betragTa.ZeilenIndex < gesamtTa.ZeilenIndex && index < lines.Length)
{
var line = lines[betragTa.ZeilenIndex];
decimal? betrag = LvrAvisTextAbschnitt.LeseBetrag(line);
decimal? betrag = LvrAvisTextAbschnittReader.LeseBetrag(line);
if (betrag.HasValue)
{
var neuerAvis = new Avis();
@@ -78,7 +78,7 @@ namespace BeWo.Service.Import.AvisImport
letzterAvis.Verwendungszweck = String.Format("{0}\n{1}", letzterAvis.Verwendungszweck, line);
}
betragTa = LvrAvisTextAbschnitt.LeseBisText(lines, betragTa.ZeilenIndex + 1, "€");
betragTa = LvrAvisTextAbschnittReader.LeseBisText(lines, betragTa.ZeilenIndex + 1, "€");
}

View File

@@ -1,4 +1,5 @@
using DevExpress.Pdf;
using BeWo.Service.Import;
using DevExpress.Pdf;
using System;
using System.Collections.Generic;
using System.IO;
@@ -9,42 +10,18 @@ using System.Threading.Tasks;
namespace BeWo.Service.Import.AvisImport
{
public class LvrAvisTextAbschnitt
public class LvrAvisTextAbschnittReader
{
public String Text { get; set; }
public int ZeilenIndex { get; set; }
public bool Success { get; set; }
public static LvrAvisTextAbschnitt LeseBisText(string[] lines, int index, String suchText)
public static TextAbschnitt LeseBisText(string[] lines, int zeilenIndex, string suchText)
{
var ta = new LvrAvisTextAbschnitt();
StringBuilder sb = new StringBuilder();
ta.ZeilenIndex = index;
while (index < lines.Length)
{
String line = lines[index];
sb.AppendLine(line);
if (line.Contains(suchText))
{
ta.Success = true;
ta.ZeilenIndex = index;
ta.Text = sb.ToString();
return ta;
}
index++;
}
return ta;
return TextAbschnittReader.LeseBisText(lines, zeilenIndex, suchText, false, true, false);
}
public static LvrAvisTextAbschnitt LeseBisDatum(string[] lines, int index, bool addDatumsZeile)
public static TextAbschnitt LeseBisDatum(string[] lines, int index, bool addDatumsZeile)
{
var ta = new LvrAvisTextAbschnitt();
var ta = new TextAbschnitt();
StringBuilder sb = new StringBuilder();
while (index < lines.Length)
@@ -89,6 +66,7 @@ namespace BeWo.Service.Import.AvisImport
}
return null;
}
}
}

View File

@@ -17,51 +17,230 @@ namespace BeWo.Service.Import.Perseh
HilfeplanImportDC result = new HilfeplanImportDC();
result.Gruppen = new List<HilfeplanImportItemDC>();
var gruppe1 = new HilfeplanImportItemDC { Label = "Leistungssuchende oder leistungsberechtigte Person", Items = new List<HilfeplanImportItemDC>() };
gruppe1.Items.Add(new HilfeplanImportItemDC { Label = "Name", Content = "Bäurle", FieldName = "LastName" });
gruppe1.Items.Add(new HilfeplanImportItemDC { Label = "Vorname", Content = "Christian", FieldName = "FirstName" });
gruppe1.Items.Add(new HilfeplanImportItemDC { Label = "Geburtsdatum", Content = "08.04.1972", FieldName = "Birthdate" });
gruppe1.Items.Add(new HilfeplanImportItemDC { Label = "Nationalität", Content = "deutsch" });
gruppe1.Items.Add(new HilfeplanImportItemDC { Label = "Beruf", Content = "Wirt" });
gruppe1.Items.Add(new HilfeplanImportItemDC { Label = "GP-Nummer/Az", Content = "73.20-2100009313-01" });
gruppe1.Items.Add(new HilfeplanImportItemDC { Label = "Erstellt von der\nleistungssuchenden oder\nleistungsberechtigten Person\nmit Behinderung unter", Content = "Max Mustermann (Bezugsbetreuer)\nMaria Musterfrau (Sozialarbeiterin)" });
//var gruppe1 = new HilfeplanImportItemDC { Label = "Leistungssuchende oder leistungsberechtigte Person", Items = new List<HilfeplanImportItemDC>() };
//gruppe1.Items.Add(new HilfeplanImportItemDC { Label = "Name", Content = "Bäurle", FieldName = "LastName" });
//gruppe1.Items.Add(new HilfeplanImportItemDC { Label = "Vorname", Content = "Christian", FieldName = "FirstName" });
//gruppe1.Items.Add(new HilfeplanImportItemDC { Label = "Geburtsdatum", Content = "08.04.1972", FieldName = "Birthdate" });
//gruppe1.Items.Add(new HilfeplanImportItemDC { Label = "Nationalität", Content = "deutsch" });
//gruppe1.Items.Add(new HilfeplanImportItemDC { Label = "Beruf", Content = "Wirt" });
//gruppe1.Items.Add(new HilfeplanImportItemDC { Label = "GP-Nummer/Az", Content = "73.20-2100009313-01" });
//gruppe1.Items.Add(new HilfeplanImportItemDC { Label = "Erstellt von der\nleistungssuchenden oder\nleistungsberechtigten Person\nmit Behinderung unter", Content = "Max Mustermann (Bezugsbetreuer)\nMaria Musterfrau (Sozialarbeiterin)" });
result.Gruppen.Add(gruppe1);
//result.Gruppen.Add(gruppe1);
gruppe1 = new HilfeplanImportItemDC { Label = "Gruppe 2", Items = new List<HilfeplanImportItemDC>() };
gruppe1.Items.Add(new HilfeplanImportItemDC { Label = "Name", Content = "Bäurle", FieldName = "LastName" });
gruppe1.Items.Add(new HilfeplanImportItemDC { Label = "Vorname", Content = "Christian", FieldName = "FirstName" });
gruppe1.Items.Add(new HilfeplanImportItemDC { Label = "Geburtsdatum", Content = "08.04.1972", FieldName = "Birthdate" });
gruppe1.Items.Add(new HilfeplanImportItemDC { Label = "Nationalität", Content = "deutsch" });
gruppe1.Items.Add(new HilfeplanImportItemDC { Label = "Beruf", Content = "Wirt" });
gruppe1.Items.Add(new HilfeplanImportItemDC { Label = "GP-Nummer/Az", Content = "73.20-2100009313-01" });
gruppe1.Items.Add(new HilfeplanImportItemDC { Label = "Erstellt von der\nleistungssuchenden oder\nleistungsberechtigten Person\nmit Behinderung unter", Content = "Max Mustermann (Bezugsbetreuer)\nMaria Musterfrau (Sozialarbeiterin)" });
//gruppe1 = new HilfeplanImportItemDC { Label = "Gruppe 2", Items = new List<HilfeplanImportItemDC>() };
//gruppe1.Items.Add(new HilfeplanImportItemDC { Label = "Name", Content = "Bäurle", FieldName = "LastName" });
//gruppe1.Items.Add(new HilfeplanImportItemDC { Label = "Vorname", Content = "Christian", FieldName = "FirstName" });
//gruppe1.Items.Add(new HilfeplanImportItemDC { Label = "Geburtsdatum", Content = "08.04.1972", FieldName = "Birthdate" });
//gruppe1.Items.Add(new HilfeplanImportItemDC { Label = "Nationalität", Content = "deutsch" });
//gruppe1.Items.Add(new HilfeplanImportItemDC { Label = "Beruf", Content = "Wirt" });
//gruppe1.Items.Add(new HilfeplanImportItemDC { Label = "GP-Nummer/Az", Content = "73.20-2100009313-01" });
//gruppe1.Items.Add(new HilfeplanImportItemDC { Label = "Erstellt von der\nleistungssuchenden oder\nleistungsberechtigten Person\nmit Behinderung unter", Content = "Max Mustermann (Bezugsbetreuer)\nMaria Musterfrau (Sozialarbeiterin)" });
result.Gruppen.Add(gruppe1);
//result.Gruppen.Add(gruppe1);
result.Ziele = new List<HilfeplanImportZielDC>();
result.Ziele.Add(new HilfeplanImportZielDC { Bereich = "Lernen und Wissensanwendung", ZielName = "Ziel 1", ZielBeschreibung = "Herr Sowieso hat eine seinen Bedürfnissen entsprechende und ihn stabilisierende Tagesstruktur mit einer regelmäßigen, genesungsfördernden Beschäftigung(z.B.Ergotherapie) entwickelt." });
result.Ziele.Add(new HilfeplanImportZielDC { Bereich = "Lernen und Wissensanwendung", ZielName = "Ziel 2", ZielBeschreibung = "Herr Sowieso hat Angstbewältigungsstrategien sowie Stabilisierungstechniken erlernt und kann diese in Alltagssituationen anwenden" });
//result.Ziele.Add(new HilfeplanImportZielDC { Bereich = "Lernen und Wissensanwendung", ZielName = "Ziel 1", ZielBeschreibung = "Herr Sowieso hat eine seinen Bedürfnissen entsprechende und ihn stabilisierende Tagesstruktur mit einer regelmäßigen, genesungsfördernden Beschäftigung(z.B.Ergotherapie) entwickelt." });
//result.Ziele.Add(new HilfeplanImportZielDC { Bereich = "Lernen und Wissensanwendung", ZielName = "Ziel 2", ZielBeschreibung = "Herr Sowieso hat Angstbewältigungsstrategien sowie Stabilisierungstechniken erlernt und kann diese in Alltagssituationen anwenden" });
result.Ziele.Add(new HilfeplanImportZielDC { Bereich = "Allgemeine Aufgaben und Anforderungen", ZielName = "Ziel 1", ZielBeschreibung = "Herr Sowieso hat eine seinen Bedürfnissen entsprechende und ihn stabilisierende Tagesstruktur mit einer regelmäßigen, genesungsfördernden Beschäftigung(z.B.Ergotherapie) entwickelt." });
result.Ziele.Add(new HilfeplanImportZielDC { Bereich = "Allgemeine Aufgaben und Anforderungen", ZielName = "Ziel 2", ZielBeschreibung = "Herr Sowieso hat Angstbewältigungsstrategien sowie Stabilisierungstechniken erlernt und kann diese in Alltagssituationen anwenden" });
//result.Ziele.Add(new HilfeplanImportZielDC { Bereich = "Allgemeine Aufgaben und Anforderungen", ZielName = "Ziel 1", ZielBeschreibung = "Herr Sowieso hat eine seinen Bedürfnissen entsprechende und ihn stabilisierende Tagesstruktur mit einer regelmäßigen, genesungsfördernden Beschäftigung(z.B.Ergotherapie) entwickelt." });
//result.Ziele.Add(new HilfeplanImportZielDC { Bereich = "Allgemeine Aufgaben und Anforderungen", ZielName = "Ziel 2", ZielBeschreibung = "Herr Sowieso hat Angstbewältigungsstrategien sowie Stabilisierungstechniken erlernt und kann diese in Alltagssituationen anwenden" });
//using (var processor = new PdfDocumentProcessor())
//{
// using (var ms = new MemoryStream(daten))
// {
// processor.LoadDocument(ms);
using (var processor = new PdfDocumentProcessor())
{
using (var ms = new MemoryStream(daten))
{
processor.LoadDocument(ms);
// var pdfText = processor.Text;
var pdfText = processor.Text;
// }
//}
var customerGruppe = ErstelleKlientenStammdatenGruppe(pdfText);
if (customerGruppe != null)
{
result.Gruppen.Add(customerGruppe);
}
result.Ziele = ErstelleAlleZiele(pdfText);
}
}
return result;
}
private IList<HilfeplanImportZielDC> ErstelleAlleZiele(string pdfText)
{
var ziele = new List<HilfeplanImportZielDC>();
//Suche Zeile "Zielplanung". So beginnt hinten im Dokument der Bereich mit der Zusammenfassung der Ziele
var zeilen = pdfText.Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);
var startIdx = -1;
var endIdx = -1;
StringBuilder gesamtTextMitZielen = new StringBuilder();
for (int i = zeilen.Length - 1; i >= 0; i--)
{
var z = zeilen[i];
if (z == "Zielplanung")
{
startIdx = i;
}
if (z.StartsWith("Übersicht der Leistungsplanung "))
{
endIdx = i;
}
}
if (startIdx >= 0)
{
for (int i = startIdx; i < endIdx; i++)
{
gesamtTextMitZielen.AppendLine(zeilen[i]);
}
zeilen = gesamtTextMitZielen.ToString().Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);
startIdx = 0;
while (startIdx >= 0)
{
var ta = TextAbschnittReader.LeseBisText(zeilen, startIdx, "Lebensbereich ", true, false, false);
if (ta.Success)
{
ziele.AddRange(ErstelleBereichMitZielen(zeilen, ta));
startIdx = ta.ZeilenIndex + 1;
}
else
{
startIdx = -1;
}
}
}
return ziele;
}
private IList<HilfeplanImportZielDC> ErstelleBereichMitZielen(string[] zeilen, TextAbschnitt ta)
{
var ziele = new List<HilfeplanImportZielDC>();
String bereich = zeilen[ta.ZeilenIndex];
int idxBereichStart = ta.ZeilenIndex + 1;
int idxBereichtEnde = zeilen.Length;
var taEnde = TextAbschnittReader.LeseBisText(zeilen, ta.ZeilenIndex + 1, "Lebensbereich ", true, false, false);
if (taEnde.Success)
{
idxBereichtEnde = taEnde.ZeilenIndex;
}
HilfeplanImportZielDC ziel = null;
for (int i = idxBereichStart; i < idxBereichtEnde; i++)
{
String zeile = zeilen[i];
if (zeile.StartsWith("Ziele • ") || zeile.StartsWith("• "))
{
ziel = new HilfeplanImportZielDC();
ziel.Bereich = bereich;
ziel.ZielName = zeile.Replace("Ziele • ", "").Replace("• ", "").Trim();
ziele.Add(ziel);
}
else if (ziel != null)
{
if (!IgnoriereZeile(zeile))
{
ziel.ZielName += " " + zeile.Trim();
}
}
}
return ziele;
}
private bool IgnoriereZeile(string zeile)
{
if (zeile.StartsWith("(c) Landschaftsverband") || zeile.StartsWith("Gesprächsleitfaden - "))
{
return true;
}
if (zeile.StartsWith("V1") || zeile.StartsWith("V2") || zeile.StartsWith("V3"))
{
return true;
}
return false;
}
private HilfeplanImportItemDC ErstelleKlientenStammdatenGruppe(string pdfText)
{
if (pdfText.Contains("Individuelle Bedarfsermittlung - Element Basisdaten"))
{
var customerGruppe = new HilfeplanImportItemDC { Label = "Stammdaten", Items = new List<HilfeplanImportItemDC>() };
customerGruppe.Items = LeseKlientenStammdaten(pdfText);
return customerGruppe;
}
return null;
}
private List<HilfeplanImportItemDC> LeseKlientenStammdaten(string pdfText)
{
var liste = new List<HilfeplanImportItemDC>();
var zeilen = pdfText.Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);
var ta = TextAbschnittReader.LeseBisText(zeilen, 0, "BEI_NRW für den Zeitraum vom ", true, false, false);
if (ta.Success)
{
var idx = ta.ZeilenIndex;
liste.Add(ErstelleStammdatenFeld("BEI_NRW für den Zeitraum vom", "ApprovalPeriod", zeilen, idx, out idx));
liste.Add(ErstelleStammdatenFeld("GP-Nummer/Az", "CustomerReferenceNumber", zeilen, idx, out idx));
liste.Add(ErstelleStammdatenFeld("Name", "Lastname", zeilen, idx, out idx));
liste.Add(ErstelleStammdatenFeld("Vorname", "Firstname", zeilen, idx, out idx));
liste.Add(ErstelleStammdatenFeld("Titel", "Titel", zeilen, idx, out idx));
liste.Add(ErstelleStammdatenFeld("Geburtsdatum", "Birthdate", zeilen, idx, out idx));
liste.Add(ErstelleStammdatenFeld("Geschlecht", "Sex", zeilen, idx, out idx));
liste.Add(ErstelleStammdatenFeld("Nationalität", "Nationality", zeilen, idx, out idx));
liste.Add(ErstelleStammdatenFeld("Beruf", "Job", zeilen, idx, out idx));
liste.Add(ErstelleStammdatenFeld("Familienstand", "FamilyStatus", zeilen, idx, out idx));
liste.Add(ErstelleStammdatenFeld("Anzahl und Alter der Kinder", "Children", zeilen, idx, out idx));
liste.Add(ErstelleStammdatenFeld("PLZ", "PostalCode", zeilen, idx, out idx));
liste.Add(ErstelleStammdatenFeld("Ort", "Town", zeilen, idx, out idx));
liste.Add(ErstelleStammdatenFeld("Straße", "Street", zeilen, idx, out idx));
liste.Add(ErstelleStammdatenFeld("Telefon", "Phone", zeilen, idx, out idx));
liste.Add(ErstelleStammdatenFeld("Fax", "Fax", zeilen, idx, out idx));
liste.Add(ErstelleStammdatenFeld("E-Mail", "EMail", zeilen, idx, out idx));
}
return liste;
}
private HilfeplanImportItemDC ErstelleStammdatenFeld(string label, string fieldname, string[] zeilen, int startIndex, out int foundIdx)
{
var item = new HilfeplanImportItemDC { Label = label, FieldName = fieldname };
var ta = TextAbschnittReader.LeseBisText(zeilen, startIndex, label, true, false, false);
foundIdx = 0;
if (ta.Success)
{
item.Content = zeilen[ta.ZeilenIndex].Replace(label, "").Trim();
if (item.Label.Contains("_"))
{
item.Label = label.Replace("_", "__");
}
foundIdx = ta.ZeilenIndex;
}
return item;
}
}
}

View File

@@ -0,0 +1,23 @@
using DevExpress.Pdf;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
namespace BeWo.Service.Import
{
public class TextAbschnitt
{
public String Text { get; set; }
public int ZeilenIndex { get; set; }
public bool Success { get; set; }
}
}

View File

@@ -0,0 +1,42 @@
using DevExpress.Pdf;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
namespace BeWo.Service.Import
{
public class TextAbschnittReader
{
public static TextAbschnitt LeseBisText(string[] lines, int index, String suchText, bool sucheAmZeilenAnfang, bool sucheInnerhalbDerZeile, bool sucheAmZeilenEnde)
{
var ta = new TextAbschnitt();
StringBuilder sb = new StringBuilder();
ta.ZeilenIndex = index;
while (index < lines.Length)
{
String line = lines[index];
sb.AppendLine(line);
if ((sucheAmZeilenAnfang && line.StartsWith(suchText)) || (sucheInnerhalbDerZeile && line.Contains(suchText)) || (sucheAmZeilenEnde && line.EndsWith(suchText)))
{
ta.Success = true;
ta.ZeilenIndex = index;
ta.Text = sb.ToString();
return ta;
}
index++;
}
return ta;
}
}
}

View File

@@ -102,8 +102,8 @@ namespace BeWo.Service.Invoicing
//decimal flmCleared = 0;
records = records.OrderBy<ServiceRecord, DateTime>(sr => sr.Start.HasValue ? sr.Start.Value : DateTime.MinValue).ToList<ServiceRecord>();
decimal maxApprovedMinutes = ((si.ApprovedFLS ?? 0) * 60) / rf;
decimal totalMinutes = 0;
decimal maxApprovedMinutes = (si.ApprovedFLS ?? 0) * 60;
decimal totalMinutesGeleistet = 0;
foreach (var iRecord in records)
{
if (iRecord.ServiceDescription.ServiceCategory.IsBillable)
@@ -159,14 +159,16 @@ namespace BeWo.Service.Invoicing
if (ap != null)
{
//Christian wars:-)
if (SchneideBeiErreichenDesBudgetsAb)
//Christian wars:-)
var dauerBudgetMitRf = dauerBudget * ((ap.RateFactor ?? 0) + 100) / 100;
if (SchneideBeiErreichenDesBudgetsAb)
{
if (totalMinutes + dauerBudget > maxApprovedMinutes)
if (totalMinutesGeleistet + dauerBudgetMitRf > maxApprovedMinutes)
{
dauerBudget = maxApprovedMinutes - totalMinutes;
if (dauerBudget < 0)
dauerBudget = maxApprovedMinutes - totalMinutesGeleistet;
dauerBudget /= ((ap.RateFactor ?? 0) + 100) / 100;
if (dauerBudget < 0)
{
dauerBudget = 0;
}
@@ -175,8 +177,12 @@ namespace BeWo.Service.Invoicing
dauerAbrechenbar = dauerBudget;
}
}
}
totalMinutes += dauerBudget;
}
totalMinutesGeleistet += dauerBudgetMitRf;
ap.RecordedMinutes += dauerAbrechenbar;
ap.BudgetMinutes += dauerBudget;
}
@@ -190,7 +196,8 @@ namespace BeWo.Service.Invoicing
}
}
si.RecordedMinutesTotal = totalMinutesGeleistet;
//decimal? maxAmount = CalculateMaxAmount(si, apList);
var gesamtListe = new List<ApprovalPeriod>();
gesamtListe.AddRange(apListFLS.Where(a => a.RecordedMinutes > 0));

View File

@@ -484,9 +484,9 @@ namespace BeWo.Service.Invoicing
}
}
si.ApprovedFLSWithActualHourlyRate = Math.Round(si.ApprovedFLSWithActualHourlyRate, 4, MidpointRounding.AwayFromZero);
si.ApprovedFLSWithHourlyRate3 = Math.Round(si.ApprovedFLSWithHourlyRate3, 4, MidpointRounding.AwayFromZero);
si.ApprovedFLSWithOldHourlyRate = Math.Round(si.ApprovedFLSWithOldHourlyRate, 4, MidpointRounding.AwayFromZero);
si.ApprovedFLSWithActualHourlyRate = Math.Round(si.ApprovedFLSWithActualHourlyRate, 2, MidpointRounding.AwayFromZero);
si.ApprovedFLSWithHourlyRate3 = Math.Round(si.ApprovedFLSWithHourlyRate3, 2, MidpointRounding.AwayFromZero);
si.ApprovedFLSWithOldHourlyRate = Math.Round(si.ApprovedFLSWithOldHourlyRate, 2, MidpointRounding.AwayFromZero);
decimal rf = 1;
if (si.RateFactor.HasValue && si.RateFactor.Value != 0)
@@ -903,17 +903,19 @@ namespace BeWo.Service.Invoicing
{
if (ii.UnitCount.HasValue)
{
var unitCountBudget = Math.Round(ii.UnitCountBudget ?? ii.UnitCount ?? 0, 2, MidpointRounding.AwayFromZero);
var unitCountBudget = Math.Round(ii.UnitCountBudget ?? ii.UnitCount ?? 0, 2, MidpointRounding.AwayFromZero);
if (maxApprovedFls < unitCountBudget)
unitCountBudget = maxApprovedFls;
maxApprovedFls -= unitCountBudget;
ii.UnitCount = Math.Round(ii.UnitCount.Value, 2, MidpointRounding.AwayFromZero);
//if (unitCountBudget < ii.UnitCount)
//{
// ii.UnitCount = unitCountBudget;
//}
if (ii.AmountPerUnit.HasValue)
if (ii.AmountPerUnit.HasValue)
{
if (!String.IsNullOrEmpty(ii.ItemDescription) && ii.ItemDescription == "Fehlkontakte" && ii.ProzentAbrechenbar.HasValue)
{

View File

@@ -40,7 +40,7 @@ namespace BeWo.Service.Plugins
//t = "9098141768"; // Fib e.V. Marburg
//t = "1505148718"; // VSD Hamm
//t = "5926081834"; // Spektrum
//t = "1378137009"; // BeWo Direkt+
//t = "1378137009"; // BeWo Direkt
//t = "3010479871"; // Aachener Verein
//t = "3849764093"; // Club 74
//t = "5805202339"; // Wegweiser Betreuungsdienst
@@ -51,7 +51,7 @@ namespace BeWo.Service.Plugins
//t = "4950382346"; // Holsinger
//t = "5973016645"; // Verein Lebensgestaltung Hanau
//t = "7375324044"; // Diakonie KK Kleve
t = "1441747891"; // BeWo Mobil Köln
//t = "1441747891"; // BeWo Mobil Köln
//t = "5120047701"; // Trialog
//t = "3629696651"; // Soziale Dienste Niederrhein (SDN)
//t = "9893557471"; // Caritas Frankfurt
@@ -390,7 +390,7 @@ namespace BeWo.Service.Plugins
//t = "8735029937"; // Caritas Ostvest
//t = "7653029063"; // SkF Leverkusen JuHi
//t = "5000000000";
t = "2663321234";
return t;
#else
if (MultitenancyOperationContextExt.Current != null)

View File

@@ -386,11 +386,13 @@
<Compile Include="Import\AvisImport\AviseImporter.cs" />
<Compile Include="Import\AvisImport\HilfeplanInfo.cs" />
<Compile Include="Import\AvisImport\LvrAvisTextReader.cs" />
<Compile Include="Import\AvisImport\LvrAvisTextAbschnitt.cs" />
<Compile Include="Import\AvisImport\LvrAvisTextAbschnittReader.cs" />
<Compile Include="Import\AvisImport\LvrAvisMonatGesamt.cs" />
<Compile Include="Import\AvisImport\LvrAvisKlientGesamt.cs" />
<Compile Include="Import\AvisImport\LvrAvisPdfReader.cs" />
<Compile Include="Import\AvisImport\Avis.cs" />
<Compile Include="Import\TextAbschnittReader.cs" />
<Compile Include="Import\TextAbschnitt.cs" />
<Compile Include="Import\Perseh\PersehReader.cs" />
<Compile Include="Invoicing\ApprovalPeriod.cs" />
<Compile Include="Invoicing\GeneralInvoiceCreation.cs" />

View File

@@ -168,6 +168,9 @@ namespace BS.Shared.DataContracts
[DataMember]
public decimal RecordedBillableFLSNetto { get; set; }
[DataMember]
public decimal RecordedMinutesTotal { get; set; }
[DataMember]
public decimal RecordedBillableFLSNotBillableCustomerAbsent { get; set; }