Merge branch 'master' of ssh://float.beyondsoft.de/git/beyondSoft/BeWo

This commit is contained in:
Lyndon Jetten
2020-02-27 10:10:36 +01:00
13 changed files with 2636 additions and 1888 deletions

View File

@@ -39,16 +39,16 @@
<UpdatePeriodically>false</UpdatePeriodically>
<UpdateRequired>true</UpdateRequired>
<MapFileExtensions>false</MapFileExtensions>
<InstallUrl>http://app.beyondsoft.de/sbdtest/</InstallUrl>
<InstallUrl>http://app.beyondsoft.de/dev/</InstallUrl>
<TargetCulture>de-DE</TargetCulture>
<ProductName>BeWoPlaner</ProductName>
<PublisherName>beyondSoft GmbH</PublisherName>
<MinimumRequiredVersion>2.0.1.173</MinimumRequiredVersion>
<MinimumRequiredVersion>2.0.1.172</MinimumRequiredVersion>
<CreateWebPageOnPublish>true</CreateWebPageOnPublish>
<WebPage>publish.htm</WebPage>
<OpenBrowserOnPublish>false</OpenBrowserOnPublish>
<TrustUrlParameters>true</TrustUrlParameters>
<ApplicationRevision>174</ApplicationRevision>
<ApplicationRevision>173</ApplicationRevision>
<ApplicationVersion>2.0.1.%2a</ApplicationVersion>
<UseApplicationTrust>false</UseApplicationTrust>
<CreateDesktopShortcut>true</CreateDesktopShortcut>
@@ -222,10 +222,6 @@
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Page Include="SchulbegleitenderDienst\View\AbsenceTimeEditView.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="SchulbegleitenderDienst\View\SbdAdminView.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
@@ -292,13 +288,17 @@
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Page Include="View\Detail\AbsenceTimesView.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="View\Detail\NotizenKategorieView.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Page Include="View\Detail\AbsenceTimesView.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="SchulbegleitenderDienst\View\AbsenceTimeEditView.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="View\Detail\BudgetView.xaml">
<Generator>MSBuild:Compile</Generator>
@@ -308,6 +308,14 @@
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Page Include="View\Detail\Report\AbwesenheitstabelleView.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Page Include="View\Detail\Report\AbwesenheitsEditView.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Page Include="View\Detail\Report\IcfImportControl.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
@@ -630,6 +638,7 @@
<Compile Include="Converter\AnonymizationRight2VisibilityConverter.cs" />
<Compile Include="Converter\BoolNullCheckConverter.cs" />
<Compile Include="Converter\BoolReverseConverter.cs" />
<Compile Include="Converter\CellColorConverter.cs" />
<Compile Include="Converter\CollectionContainsTag2BoolConverter.cs" />
<Compile Include="Converter\CollectionCountToBoolConverter.cs" />
@@ -653,7 +662,7 @@
<Compile Include="Core\BeWoWebClient.cs">
<SubType>Component</SubType>
</Compile>
<Compile Include="Core\Commands\ButtonClickCommand.cs" />
<Compile Include="Core\Commands\ButtonClickCommand.cs" />
<Compile Include="Core\Config\AppSettings.cs" />
<Compile Include="Core\CustomSpellCheckerLocalizer.cs" />
<Compile Include="Core\DocumentWatcher.cs" />
@@ -698,11 +707,11 @@
</Compile>
<Compile Include="SchulbegleitenderDienst\TagesansichtVM.cs" />
<Compile Include="SchulbegleitenderDienst\TagesVertretung.cs" />
<Compile Include="SchulbegleitenderDienst\ViewModel\AbsenceTimeEditViewModel.cs" />
<Compile Include="SchulbegleitenderDienst\ViewModel\AbsenceTimeEditViewModel.cs" />
<Compile Include="SchulbegleitenderDienst\ViewModel\SbdConfigVM.cs" />
<Compile Include="SchulbegleitenderDienst\ViewModel\VertretungsansichtBaseVM.cs" />
<Compile Include="SchulbegleitenderDienst\ViewModel\VertretungWochenansichtVM.cs" />
<Compile Include="SchulbegleitenderDienst\View\AbsenceTimeEditView.xaml.cs">
<Compile Include="SchulbegleitenderDienst\View\AbsenceTimeEditView.xaml.cs">
<DependentUpon>AbsenceTimeEditView.xaml</DependentUpon>
</Compile>
<Compile Include="SchulbegleitenderDienst\View\SbdAdminView.xaml.cs">
@@ -875,14 +884,20 @@
<Compile Include="View\Controls\ValueListEntryEditControl.xaml.cs">
<DependentUpon>ValueListEntryEditControl.xaml</DependentUpon>
</Compile>
<Compile Include="View\Detail\AbsenceTimesView.xaml.cs">
<DependentUpon>AbsenceTimesView.xaml</DependentUpon>
</Compile>
<Compile Include="View\Detail\NotizenKategorieView.xaml.cs">
<DependentUpon>NotizenKategorieView.xaml</DependentUpon>
</Compile>
<Compile Include="View\Detail\BudgetView.xaml.cs">
<DependentUpon>BudgetView.xaml</DependentUpon>
</Compile>
<Compile Include="View\Detail\AbsenceTimesView.xaml.cs">
<DependentUpon>AbsenceTimesView.xaml</DependentUpon>
</Compile>
<Compile Include="View\Detail\Report\AbwesenheitstabelleView.xaml.cs">
<DependentUpon>AbwesenheitstabelleView.xaml</DependentUpon>
</Compile>
<Compile Include="View\Detail\Report\AbwesenheitsEditView.xaml.cs">
<DependentUpon>AbwesenheitsEditView.xaml</DependentUpon>
</Compile>
<Compile Include="View\Detail\Report\IcfImportControl.xaml.cs">
<DependentUpon>IcfImportControl.xaml</DependentUpon>
@@ -2750,7 +2765,6 @@
<ItemGroup>
<Resource Include="Ressources\Icons\Paste24.png" />
</ItemGroup>
<ItemGroup />
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<PropertyGroup>
<PostBuildEvent>

View File

@@ -1058,7 +1058,7 @@ namespace BeWo.Scheduler.View
ShowPrivateAppointmentsCheckBox.IsChecked = true;
}
ViewModel.ActiveAppointmentViewModel.InsertAppointments(Scheduler, appList);
ViewModel.ActiveAppointmentViewModel.InsertAppointments(Scheduler, appList);
UpdateRequestString();
ReloadVM(true);
}
@@ -1141,7 +1141,6 @@ namespace BeWo.Scheduler.View
{
e.Menu.ItemLinks.Remove(verfuegbarkeitMenue);
}
}
if(Scheduler.SelectedAppointments.Count == 0 || Scheduler.SelectedAppointments[0]?.Type != AppointmentType.ChangedOccurrence)

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,44 @@
<UserControl
xmlns:dxe="http://schemas.devexpress.com/winfx/2008/xaml/editors"
xmlns:dxg="http://schemas.devexpress.com/winfx/2008/xaml/grid"
Height="Auto" Width="Auto" HorizontalAlignment="Stretch"
VerticalAlignment="Stretch" Focusable="True"
xmlns:val="clr-namespace:BeWo.Validation"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:dxsch="http://schemas.devexpress.com/winfx/2008/xaml/scheduler"
x:Class="BeWo.View.Detail.Report.AbwesenheitsEditView"
d:DesignHeight="300" d:DesignWidth="300"
mc:Ignorable="d">
<Grid Background="{StaticResource ObjectEditBackgroundBrush}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="10" />
<ColumnDefinition Width="*" MinWidth="100" />
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="*" MinHeight="100"/>
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Label Grid.Column="0" Grid.Row="0" Content="Start:" HorizontalAlignment="Left" VerticalAlignment="Center"/>
<dxe:DateEdit x:Name="_DatePickerStartDate" Grid.Column="2" Grid.Row="0" Grid.ColumnSpan="2" MaskType="DateTimeAdvancingCaret" HorizontalAlignment="Stretch" Margin="3" AllowNullInput="False" />
<Label Grid.Column="0" Grid.Row="1" Content="Ende:" HorizontalAlignment="Left" VerticalAlignment="Center"/>
<dxe:DateEdit x:Name="_DatePickerEndDate" Grid.Column="2" Grid.Row="1" Grid.ColumnSpan="2" MaskType="DateTimeAdvancingCaret" HorizontalAlignment="Stretch" Margin="3" />
<Label Grid.Column="0" Grid.Row="2" Content="Kategorie:" HorizontalAlignment="Left" VerticalAlignment="Center"/>
<dxe:ComboBoxEdit x:Name="_ReasonPicker" Grid.Column="2" Grid.Row="2" Grid.ColumnSpan="2" Margin="3" DisplayMember="Description"/>
<Label Grid.Column="0" Grid.Row="3" Content="Bemerkung:" HorizontalAlignment="Left" VerticalAlignment="Center"/>
<TextBox x:Name="_NoticeTxt" Grid.Column="2" Grid.Row="3" Grid.ColumnSpan="2" Margin="3"/>
<Button x:Name="_DeleteBtn" Visibility="Collapsed" Grid.Column="0" Grid.Row="5" Content="Löschen" Margin="3" Click="DeleteBtn_Click" HorizontalAlignment="Left" />
<Button x:Name="_SaveBtn" Grid.Column="2" Grid.Row="5" Content="Speichern" Margin="3, 3, 4, 3" HorizontalAlignment="Right" Click="SaveBtn_Click" MinWidth="80"/>
<Button x:Name="_CancelBtn" Grid.Column="3" Grid.Row="5" Content="Abbrechen" Margin="3" Click="CancelBtn_Click"/>
</Grid>
</UserControl>

View File

@@ -0,0 +1,127 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using BeWo.Core;
using BeWo.ServiceProxy;
using BS.Shared.DataContracts;
using BS.Shared.Extensions;
using DevExpress.Utils;
using DevExpress.Xpf.Scheduler;
using DevExpress.Xpf.Scheduler.UI;
using DevExpress.XtraGrid.Views.Grid.ViewInfo;
using DevExpress.XtraScheduler;
using SchedulerControl = DevExpress.Xpf.Scheduler.SchedulerControl;
namespace BeWo.View.Detail.Report
{
/// <summary>
/// Interaktionslogik für TestEMailControl.xaml
/// </summary>
public partial class AbwesenheitsEditView : UserControl
{
private SchedulerControl _SchedulerControl;
public bool IsEditMode { get; set; }
public AbsenceTimeDC AbsenceTime { get; set; }
public Appointment Appointment { get; }
/// <summary>
/// Für Appointment-Bearbeitung
/// </summary>
/// <param name="appointment"></param>
/// <param name="absenceTimeDC"></param>
/// <param name="reasons"></param>
public AbwesenheitsEditView(SchedulerControl schedulerControl, Appointment appointment, AbsenceTimeDC absenceTimeDC, List<AbsenceReasonDC> reasons)
{
InitializeComponent();
_SchedulerControl = schedulerControl;
_ReasonPicker.Items.AddRange(reasons.ToArray());
Appointment = appointment;
IsEditMode = appointment.CustomFields["AbsenceTime"] != null;
if (IsEditMode)
{
_DeleteBtn.Visibility = Visibility.Visible;
AbsenceTime = absenceTimeDC;
_ReasonPicker.SelectedItem = absenceTimeDC.Reason;
_NoticeTxt.Text = absenceTimeDC.Notice;
}
else
{
AbsenceTime = new AbsenceTimeDC();
AbsenceTime.EmployeeOid = long.Parse(appointment.ResourceId.ToString());
AbsenceTime.Start = AbsenceTime.End = Appointment.Start;
_ReasonPicker.SelectedItem = reasons[0];
}
_DatePickerStartDate.DateTime = AbsenceTime.Start.Value;
if (AbsenceTime.End.HasValue) _DatePickerEndDate.DateTime = AbsenceTime.End.Value;
}
private void CancelBtn_Click(object sender, RoutedEventArgs e)
{
SchedulerFormBehavior.Close(this, false);
}
private void DeleteBtn_Click(object sender, RoutedEventArgs e)
{
if (MessageBox.Show("Möchten Sie den Eintrag wirklich löschen?", "Eintrag löschen", MessageBoxButton.YesNo, MessageBoxImage.Warning) != MessageBoxResult.Yes)
return;
_SchedulerControl.Storage.AppointmentStorage.Remove(Appointment);
ServiceFacade.DoOperationsServiceAsync(x => x.DeleteAbsenceTime(AbsenceTime));
SchedulerFormBehavior.Close(this, true);
}
private void SaveBtn_Click(object sender, RoutedEventArgs e)
{
var start = _DatePickerStartDate.DateTime;
var end = string.IsNullOrEmpty(_DatePickerEndDate.Text) ? null : _DatePickerEndDate.DateTime as DateTime?;
if (end.HasValue && end < start)
{
MessageBox.Show("Der Anfang darf nicht nach dem Ende kommen.", "Fehler", MessageBoxButton.OK);
return;
}
AbsenceTime.Reason = (AbsenceReasonDC)_ReasonPicker.SelectedItem;
AbsenceTime.Notice = _NoticeTxt.Text;
AbsenceTime.Start = start;
AbsenceTime.End = end;
if (IsEditMode)
{
AbsenceTime = ServiceFacade.DoOperationsServiceSync(x => x.UpdateAbsenceTimeWithReturn(AbsenceTime));
var t = AbsenceTime.AbsenceTimeVersion;
SchedulerHelper.OverrideAWithB(Appointment, AbsenceTime);
}
else
{
AbsenceTime = ServiceFacade.DoOperationsServiceSync(x => x.InsertAbsenceTimeWithReturn(AbsenceTime));
SchedulerHelper.OverrideAWithB(Appointment, AbsenceTime);
_SchedulerControl.Storage.AppointmentStorage.Add(Appointment);
}
SchedulerFormBehavior.Close(this, true);
}
}
}

View File

@@ -0,0 +1,178 @@
<localView:BeWoView
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:dxg="http://schemas.devexpress.com/winfx/2008/xaml/grid"
xmlns:dx="http://schemas.devexpress.com/winfx/2008/xaml/core"
xmlns:dxe="http://schemas.devexpress.com/winfx/2008/xaml/editors"
xmlns:dxsch="http://schemas.devexpress.com/winfx/2008/xaml/scheduler"
xmlns:localView="clr-namespace:BeWo.View"
xmlns:uc="clr-namespace:BeWo.Controls;assembly=BeWo.Controls"
xmlns:dxschi="http://schemas.devexpress.com/winfx/2008/xaml/scheduler/internal"
xmlns:XtraScheduler="clr-namespace:DevExpress.XtraScheduler;assembly=DevExpress.XtraScheduler.v17.1.Core"
x:Class="BeWo.View.Detail.Report.AbwesenheitstabelleView"
Height="Auto" Width="Auto" HorizontalAlignment="Stretch"
VerticalAlignment="Stretch" Focusable="True">
<localView:BeWoView.Resources>
<Style x:Key="VerticalResourceHeaderStyle" TargetType="{x:Type dxschi:VisualResourceHeader}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type dxschi:VisualResourceHeader}">
<Grid>
<dxschi:VerticalHeaderControl SnapsToDevicePixels="True"
ResourceColor="{Binding ResourceHeader.Brushes.ResourceHeader}"
Content="{TemplateBinding Content}" ContentTemplate="{TemplateBinding ContentTemplate}"
dxschi:SchedulerItemsControl.ElementPosition="{Binding (dxschi:SchedulerItemsControl.ElementPosition), RelativeSource={RelativeSource TemplatedParent}}"
/>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<TextBlock VerticalAlignment="Center" HorizontalAlignment="Center" SnapsToDevicePixels="True" Margin="4"
FontSize="12"
Foreground="White"
Text="{Binding ResourceCaption}"
/>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
</localView:BeWoView.Resources>
<Grid>
<GroupBox Header="Abwesenheitstabelle" Style="{StaticResource ObjectEditGroupBox}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<!--Erste Zeile Links-->
<Grid Grid.Column="0" Grid.Row="0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Label Grid.Column="0" Grid.Row="0" Content="Abwesenheitskategorie" Margin="3,3,0,3" />
<dxe:ComboBoxEdit x:Name="FilterAbwesenheit" Grid.Column="1" Grid.Row="0" Margin="0,3,3,3" DisplayMember="Description">
<dxe:ComboBoxEdit.StyleSettings>
<dxe:CheckedComboBoxStyleSettings />
</dxe:ComboBoxEdit.StyleSettings>
</dxe:ComboBoxEdit>
<Label Grid.Column="2" Grid.Row="0" Content="Beschäftigungsart" Margin="3,3,0,3"/>
<dxe:ComboBoxEdit x:Name="FilterBeschaftigungsart" Grid.Column="3" Grid.Row="0" Margin="0,3,3,3" DisplayMember="Name">
<dxe:ComboBoxEdit.StyleSettings>
<dxe:CheckedComboBoxStyleSettings />
</dxe:ComboBoxEdit.StyleSettings>
</dxe:ComboBoxEdit>
</Grid>
<!--Erste Zeile Rechts-->
<Grid Grid.Column="2" Grid.Row="0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Label Grid.Column="3" Content="Anzahl der angezeigten Tage"/>
<dxe:SpinEdit x:Name="_SpinEdit" Grid.Column="4" Grid.Row="0" AllowNullInput="False" Height="23" Width="50" IsFloatValue="False" EditValueChanged="SpinEdit_EditValueChanged"/>
</Grid>
<!--Zweite Zeile Links-->
<Grid Grid.Column="0" Grid.Row="1" HorizontalAlignment="Left">
<Button Grid.Column="0" Grid.Row="0" Content="Erstellen" Margin="3" MinWidth="100" Click="Button_Click"/>
</Grid>
<!--Zweite Zeile Rechts-->
<Grid Grid.Column="2" Grid.Row="1" HorizontalAlignment="Right">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Label Grid.Column="0" Grid.Row="0" Content="Datum" Margin="3"/>
<dxe:DateEdit x:Name="_DateTimePicker" Grid.Column="1" Grid.Row="0" Margin="3,3,0,3" EditValueChanged="DateEdit_EditValueChanged" />
</Grid>
<dxsch:SchedulerControl dx:ThemeManager.ThemeName="Office2010Black" Grid.Column="0" Grid.Row="2" Grid.ColumnSpan="3" x:Name="_SchedulerControl" ActiveViewType="Timeline" Visibility="Collapsed" GroupType="Resource" IsManipulationEnabled="True" AllowDrop="False" IsTabStop="False"
EditAppointmentFormShowing="SchedularControl_EditAppointmentFormShowing" EditRecurrentAppointmentFormShowing="SchedularControl_EditRecurrentAppointmentFormShowing" FormCustomizationUsingMVVMLocal="False" AppointmentViewInfoCustomizing="SchedulerControl_AppointmentViewInfoCustomizing">
<!--<dxsch:SchedulerControl.Storage>
<dxsch:SchedulerStorage>
<dxsch:SchedulerStorage.ResourceStorage>
<dxsch:ResourceStorage DataSource="_EmployeesWithAbsence">
<dxsch:ResourceStorage.Mappings>
<dxsch:ResourceMapping Caption="LastNameFirstName"/>
</dxsch:ResourceStorage.Mappings>
</dxsch:ResourceStorage>
</dxsch:SchedulerStorage.ResourceStorage>
<dxsch:SchedulerStorage.AppointmentStorage>
<dxsch:AppointmentStorage DataSource="_AbsenceReasons">
<dxsch:AppointmentStorage.Mappings >
<dxsch:AppointmentMapping/>
</dxsch:AppointmentStorage.Mappings>
</dxsch:AppointmentStorage>
</dxsch:SchedulerStorage.AppointmentStorage>
</dxsch:SchedulerStorage>
</dxsch:SchedulerControl.Storage>-->
<dxsch:SchedulerControl.OptionsCustomization>
<dxsch:OptionsCustomization AllowAppointmentCopy="None" AllowAppointmentCreate="All" AllowAppointmentDelete="None" AllowAppointmentDrag="None" AllowAppointmentDragBetweenResources="None" AllowAppointmentEdit="All" AllowAppointmentResize="None" AllowInplaceEditor="None" AllowAppointmentMultiSelect="False"/>
</dxsch:SchedulerControl.OptionsCustomization>
<dxsch:SchedulerControl.OptionsView>
<dxsch:OptionsView/>
</dxsch:SchedulerControl.OptionsView>
<dxsch:SchedulerControl.OptionsBehavior>
<dxsch:OptionsBehavior/>
</dxsch:SchedulerControl.OptionsBehavior>
<dxsch:SchedulerControl.DayView >
<dxsch:DayView />
</dxsch:SchedulerControl.DayView>
<dxsch:SchedulerControl.FullWeekView >
<dxsch:FullWeekView Enabled="false"/>
</dxsch:SchedulerControl.FullWeekView>
<dxsch:SchedulerControl.MonthView >
<dxsch:MonthView Enabled="false"/>
</dxsch:SchedulerControl.MonthView>
<dxsch:SchedulerControl.WeekView >
<dxsch:WeekView Enabled="false"/>
</dxsch:SchedulerControl.WeekView>
<dxsch:SchedulerControl.WorkWeekView>
<dxsch:WorkWeekView />
</dxsch:SchedulerControl.WorkWeekView>
<dxsch:SchedulerControl.TimelineView>
<dxsch:TimelineView ResourcesPerPage="10" IntervalCount="31" TimelineScrollBarVisibility="Auto" AppointmentToolTipVisibility="Never" >
<dxsch:TimelineView.Scales>
<XtraScheduler:TimeScaleYear/>
<XtraScheduler:TimeScaleMonth/>
<XtraScheduler:TimeScaleDay/>
</dxsch:TimelineView.Scales>
<dxsch:TimelineView.AppointmentDisplayOptions>
<dxsch:SchedulerTimelineViewAppointmentDisplayOptions SnapToCellsMode="Auto" EndTimeVisibility="Never" StartTimeVisibility="Never"/>
</dxsch:TimelineView.AppointmentDisplayOptions>
</dxsch:TimelineView>
</dxsch:SchedulerControl.TimelineView>
</dxsch:SchedulerControl>
</Grid>
</GroupBox>
</Grid>
</localView:BeWoView>

View File

@@ -0,0 +1,242 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Input;
using System.Windows.Forms;
using System.Windows.Media;
using BeWo.Controls;
using BeWo.Core;
using BeWo.ServiceProxy;
using BeWo.ViewModel;
using BS.Shared;
using BS.Shared.Core;
using BS.Shared.DataContracts;
using BS.Shared.DataContracts.Compact;
using BS.Shared.Extensions;
using BS.Shared.Translation;
using DevExpress.Services;
using DevExpress.XtraScheduler;
using DevExpress.Xpf.Scheduler;
using DevExpress.Xpf.Scheduler.Native;
using SchedulerStorage = DevExpress.Xpf.Scheduler.SchedulerStorage;
using ResourceStorage = DevExpress.Xpf.Scheduler.ResourceStorage;
using AppointmentStorage = DevExpress.Xpf.Scheduler.AppointmentStorage;
using IAppointmentLabelStorage = DevExpress.Xpf.Scheduler.AppointmentLabelCollection;
using BeWo.Scheduler.View;
using AppointmentLabel = DevExpress.Xpf.Scheduler.AppointmentLabel;
namespace BeWo.View.Detail.Report
{
/// <summary>
/// Interaction logic for AbwesenheitstabelleView.xaml
/// </summary>
public partial class AbwesenheitstabelleView : BeWoView
{
private SchedulerStorage _SchedulerStorage;
private IAppointmentLabelStorage _LabelStorage;
private ResourceStorage _ResourceStorage;
private AppointmentStorage _AppointmentStorage;
private List<AbsenceReasonDC> _AbsenceReasonDCs;
public AbwesenheitstabelleView()
{
InitializeComponent();
_SchedulerStorage = _SchedulerControl.Storage;
_LabelStorage = _SchedulerControl.Storage.AppointmentStorage.Labels;
_ResourceStorage = _SchedulerControl.Storage.ResourceStorage;
_AppointmentStorage = _SchedulerControl.Storage.AppointmentStorage;
_AppointmentStorage.CustomFieldMappings.Add(new SchedulerCustomFieldMapping("AbsenceTime", "AbsenceTime"));
_SchedulerStorage.AppointmentsInserted += _SchedularStorage_AppointmentsInserted;
_SchedulerStorage.AppointmentInserting += _SchedularStorage_AppointmentInserting;
_SchedulerControl.TimelineView.VerticalResourceHeaderStyle = (Style)this.FindResource("VerticalResourceHeaderStyle");
IMouseHandlerService oldMouseHandler = (IMouseHandlerService)_SchedulerControl.GetService(typeof(IMouseHandlerService));
if (oldMouseHandler != null)
{
MouseHandlerService newMouseHandler =
new MouseHandlerService(_SchedulerControl, oldMouseHandler);
_SchedulerControl.RemoveService(typeof(IMouseHandlerService));
_SchedulerControl.AddService(typeof(IMouseHandlerService), newMouseHandler);
}
var kategorien = ServiceFacade.DoOperationsServiceSync(x => x.GetAllAbsenceReason());
foreach (var item in kategorien)
{
FilterAbwesenheit.Items.Add(item);
}
var arbeitsarten = ServiceFacade.DoEmployeeServiceSync(x => x.GetAllEmploymentTypes());
foreach (var item in arbeitsarten)
{
FilterBeschaftigungsart.Items.Add(item);
}
var td = DateTime.Today;
_DateTimePicker.DateTime = td.AddDays(1 - td.Day);
_SpinEdit.Text = DateTime.DaysInMonth(td.Year, td.Month).ToString();
}
private void _SchedularStorage_AppointmentInserting(object sender, PersistentObjectCancelEventArgs e)
{
}
private void _SchedularStorage_AppointmentsInserted(object sender, PersistentObjectsEventArgs e)
{
}
private void Button_Click(object sender, RoutedEventArgs e)
{
Update();
}
private void SchedularControl_EditAppointmentFormShowing(object sender, EditAppointmentFormEventArgs e)
{
var apt = e.Appointment;
e.AllowResize = false;
e.Form = new AbwesenheitsEditView(_SchedulerControl, apt, (AbsenceTimeDC)apt.CustomFields["AbsenceTime"], _AbsenceReasonDCs);
}
private void SchedularControl_EditRecurrentAppointmentFormShowing(object sender, EditAppointmentFormEventArgs e)
{
e.Cancel = true;
}
private void SchedulerControl_AppointmentViewInfoCustomizing(object sender, DevExpress.Xpf.Scheduler.AppointmentViewInfoCustomizingEventArgs e)
{
}
private void SpinEdit_EditValueChanged(object sender, DevExpress.Xpf.Editors.EditValueChangedEventArgs e)
{
if (e.NewValue == null || !int.TryParse(e.NewValue.ToString(), out var count))
return;
if (count > 0)
_SchedulerControl.TimelineView.IntervalCount = count;
}
private void DateEdit_EditValueChanged(object sender, DevExpress.Xpf.Editors.EditValueChangedEventArgs e)
{
var dp = _DateTimePicker.DateTime;
_DateTimePicker.DateTime = dp.AddDays(1 - dp.Day);
_SpinEdit.Value = DateTime.DaysInMonth(dp.Year, dp.Month);
_SchedulerControl.Start = _DateTimePicker.DateTime;
}
public void Update()
{
_AbsenceReasonDCs = ServiceFacade.DoOperationsServiceSync(x => x
.GetAllAbsenceReason());
var absenceTimes = ServiceFacade.DoOperationsServiceSync(x => x
.GetAbsenceTimeDCsFilter(new DateTime(2000, 1, 1), new DateTime(2021, 1, 1)))
.Where(f => f.EmployeeOid.HasValue)
.ToList();
var empIDs = absenceTimes.Select(x => x.EmployeeOid.Value).Distinct().ToList();
var empWithAbsence = ServiceFacade.DoEmployeeServiceSync(x => x
.GetAllEmployees()
.Where(emp => empIDs.Contains(emp.EmployeeOid.Value)))
.ToList()
.OrderBy(x => x.LastNameFirstName);
try
{
_SchedulerStorage.BeginUpdate();
_LabelStorage.Clear();
foreach (var reason in _AbsenceReasonDCs)
{
var label = _LabelStorage.CreateNewLabel(reason.AbsenceReasonOid.ToString(), reason.Description);
label.Color = (Color)ColorConverter.ConvertFromString(reason.Color);
_LabelStorage.Add(label);
}
_ResourceStorage.Clear();
var listEmps = FilterBeschaftigungsart.SelectedItems.Count == 0 ? empWithAbsence : empWithAbsence.Where(x => x.Contracts.Exists(y => FilterBeschaftigungsart.SelectedItems.Contains(y.EmploymentType)));
foreach (var employee in listEmps)
{
var resource = _SchedulerStorage.CreateResource(employee.EmployeeOid.Value.ToString());
resource.Caption = employee.LastNameFirstName;
_ResourceStorage.Add(resource);
}
_AppointmentStorage.Clear();
var listAbs = (FilterAbwesenheit.SelectedItems.Count == 0 ? absenceTimes : absenceTimes.Where(x => FilterAbwesenheit.SelectedItems.Contains(x.Reason)))
.Where(y => listEmps.Select(x => x.EmployeeOid).Contains(y.EmployeeOid));
foreach (var absenceTime in listAbs)
{
var appointment = _SchedulerStorage.CreateAppointment(AppointmentType.Normal);
SchedulerHelper.OverrideAWithB(appointment, absenceTime);
_AppointmentStorage.Add(appointment);
}
}
finally
{
_SchedulerStorage.EndUpdate();
_SchedulerControl.Visibility = Visibility.Visible;
}
}
}
public class MouseHandlerService : MouseHandlerServiceWrapper
{
IServiceProvider provider;
public MouseHandlerService(IServiceProvider provider, IMouseHandlerService service)
: base(service)
{
this.provider = provider;
}
public override void OnMouseWheel(System.Windows.Forms.MouseEventArgs e)
{
if ((System.Windows.Forms.Control.ModifierKeys & Keys.Control) != Keys.Control)
base.OnMouseWheel(e);
}
}
public static class SchedulerHelper
{
public static void OverrideAWithB(Appointment appointment, AbsenceTimeDC absenceTime)
{
appointment.AllDay = true;
appointment.Subject = absenceTime.Reason.Description;
appointment.Start = absenceTime.Start.Value;
appointment.End = (absenceTime.End ?? DateTime.MaxValue.AddDays(-1)).AddHours(23);
appointment.ResourceId = absenceTime.EmployeeOid.Value.ToString();
appointment.LabelKey = absenceTime.Reason.AbsenceReasonOid.ToString();
appointment.Description = absenceTime.Notice;
appointment.CustomFields["AbsenceTime"] = null;
appointment.CustomFields["AbsenceTime"] = absenceTime;
}
}
}

View File

@@ -38,6 +38,7 @@
<TabItem Header="{markup:Translate Mitarbeiterauswertung}" Name="tabitem_Mitarbeiter" Selector.Selected="tabitem_Mitarbeiter_Selected"/>
<TabItem Header="{markup:Translate Mitarbeiterauslastung}" Name="tabitem_maReport" Selector.Selected="tabitem_maReport_Selected"/>
<TabItem Header="{markup:Translate Mitarbeiterstundenkonto}" Name="tabitem_makonto" Selector.Selected="tabitem_maKonto_Selected"/>
<TabItem Header="{markup:Translate Abwesenheitstabelle}" Name="tabitem_abwesenheitsTabelle" Selector.Selected="tabitem_abwesenheitsTabelle_Selected"/>
<TabItem Header="{markup:Translate Hilfeplanübersicht}" Name="tabitem_supportConceptAnalysis" Selector.Selected="tabitem_supportConceptAnalysis_Selected" />
<TabItem Header="{markup:Translate Jahresbericht}" Name="tabitem_annualReport" Selector.Selected="tabitem_annualReport_Selected" />
<TabItem Header="{markup:Translate Quittierungsbelege}" Name="tabitem_serviceOverview" Selector.Selected="tabitem_serviceOverview_Selected" />

View File

@@ -119,7 +119,7 @@ namespace BeWo.View.Master
tabitem_stundenzettelOverview.Visibility = Visibility.Collapsed;
}
if (BeWoApp.AppSettings.ShowPivotGrid)
if (true || BeWoApp.AppSettings.ShowPivotGrid)
{
tabitem_flexibleReport.Visibility = Visibility.Visible;
}
@@ -182,6 +182,13 @@ namespace BeWo.View.Master
Show(tabitem_makonto);
}
private void tabitem_abwesenheitsTabelle_Selected(object sender, RoutedEventArgs e)
{
if (!_OpenViews.ContainsKey(tabitem_abwesenheitsTabelle))
_OpenViews[tabitem_abwesenheitsTabelle] = new AbwesenheitstabelleView();
Show(tabitem_abwesenheitsTabelle);
}
private void tabitem_queries_Selected(object sender, RoutedEventArgs e)
{
if (!_OpenViews.ContainsKey(tabitem_queries))

View File

@@ -766,10 +766,6 @@
<SubType>Designer</SubType>
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
<None Include="App.config" />
<None Include="packages.config" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>

View File

@@ -847,5 +847,25 @@ namespace BeWo.Service.ServiceContracts
[FaultContract(typeof(BeWoFault))]
[OperationContract]
IList<ReportTemplateDC> GetReportTemplates(string url);
[FaultContract(typeof(BeWoFault))]
[OperationContract]
IList<AbsenceTimeDC> GetAbsenceTimeDCsFilter(DateTime start, DateTime end);
[FaultContract(typeof(BeWoFault))]
[OperationContract]
IList<AbsenceReasonDC> GetAllAbsenceReason();
[FaultContract(typeof(BeWoFault))]
[OperationContract]
AbsenceTimeDC UpdateAbsenceTimeWithReturn(AbsenceTimeDC absenceTimeDC);
[FaultContract(typeof(BeWoFault))]
[OperationContract]
AbsenceTimeDC InsertAbsenceTimeWithReturn(AbsenceTimeDC absenceTimeDC);
[FaultContract(typeof(BeWoFault))]
[OperationContract]
void DeleteAbsenceTime(AbsenceTimeDC absenceTimeDC);
}
}

View File

@@ -5880,5 +5880,76 @@ namespace BeWo.Service.ServiceImplementations
throw Utils.CreateBeWoFaultException(e);
}
}
public IList<AbsenceTimeDC> GetAbsenceTimeDCsFilter(DateTime start, DateTime end)
{
var list = DAOFactory.GenericDAO.GetAllActive<AbsenceTime>().Where(x => x.Start.HasValue).Where(y => y.Start >= start && (!y.End.HasValue || y.End.Value <= end)).Where(z => z.EmployeeOid.HasValue);
return MapperFactory.AbsenceTimeDC_AbsenceTime.MapToNewDCs(list);
}
public IList<AbsenceReasonDC> GetAllAbsenceReason()
{
var list = DAOFactory.GenericDAO.GetAllActive<AbsenceReason>();
return MapperFactory.AbsenceReasonDC_AbsenceReason.MapToNewDCs(list);
}
public AbsenceTimeDC UpdateAbsenceTimeWithReturn(AbsenceTimeDC abs)
{
try
{
var testbefore = abs.AbsenceTimeVersion;
var x = DAOFactory.GenericDAO.LoadByID<AbsenceTime>(abs.AbsenceTimeOid.Value);
MapperFactory.AbsenceTimeDC_AbsenceTime.MergeWithEntity(abs, x);
DAOFactory.GenericDAO.Update(x);
var y = DAOFactory.GenericDAO.LoadByID<AbsenceTime>(abs.AbsenceTimeOid.Value);
var z = MapperFactory.AbsenceTimeDC_AbsenceTime.MapToNewDC(y);
return z;
}
catch (Exception e)
{
throw Utils.CreateBeWoFaultException(e);
}
}
public AbsenceTimeDC InsertAbsenceTimeWithReturn(AbsenceTimeDC absenceTimeDC)
{
try
{
var emp = DAOFactory.GenericDAO.GetByID<Employee>(absenceTimeDC.EmployeeOid.Value);
emp.AbsenceTimes.Add(MapperFactory.AbsenceTimeDC_AbsenceTime.MapToNewEntity(absenceTimeDC));
DAOFactory.GenericDAO.Update(emp);
emp = DAOFactory.GenericDAO.LoadByID<Employee>(absenceTimeDC.EmployeeOid.Value);
var newAbsenceTimeOid = emp.AbsenceTimes.Max(x => x.Oid);
var newAbsenceTimeDC = DAOFactory.GenericDAO.GetByID<AbsenceTime>(newAbsenceTimeOid.Value);
newAbsenceTimeDC.EmployeeOid = emp.Oid;
return MapperFactory.AbsenceTimeDC_AbsenceTime.MapToNewDC(newAbsenceTimeDC);
}
catch (Exception e)
{
throw Utils.CreateBeWoFaultException(e);
}
}
public void DeleteAbsenceTime(AbsenceTimeDC absenceTimeDC)
{
try
{
var emp = DAOFactory.GenericDAO.GetByID<Employee>(absenceTimeDC.EmployeeOid.Value);
emp.AbsenceTimes.Remove(emp.AbsenceTimes.First(a => a.Oid == absenceTimeDC.AbsenceTimeOid));
DAOFactory.GenericDAO.Update(emp);
}
catch (Exception e)
{
throw Utils.CreateBeWoFaultException(e);
}
}
}
}

View File

@@ -132,5 +132,9 @@ namespace BS.Shared.DataContracts
return new SolidColorBrush((Color) ColorConverter.ConvertFromString(EmployeeColor));
}
public virtual string LastNameFirstName
{
get => LastName + ", " + FirstName;
}
}
}