Files
BeWoPlaner/BeWo/Scheduling/ViewModel/SchedulingAppointmentListVM.cs
Lyndon Jetten e0447d0a05 MoK:
Intervallfinder überarbeitet & Bug gefixt, der zu einem Fehler beim Suchen nach freien Intervallen über mehrere Tage geführt hatte, wenn die Enduhrzeit vor der Startuhrzeit lag.

Berichte mit Parametern.

Verbesserte Mitarbeiter-, Klienten-, Team-, und Organisationsdropdowns mit Suche.

Quittierungsbelegresultate (zum Unterschreiben) wird wie die Zeiterfassung paginiert.

FaC:

neuer Kalender noch nicht fertig.
2024-11-12 18:37:23 +01:00

702 lines
24 KiB
C#

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Windows;
using BeWo.Scheduling.SchedulingUtils;
using BeWo.ViewModel.ListViewModel;
using BS.Shared;
using BS.Shared.Core;
using BS.Shared.DataContracts;
using BS.Shared.DataContracts.Compact;
using BS.Shared.Extensions;
using DevExpress.Mvvm;
namespace BeWo.Scheduling.ViewModel
{
public class SchedulingAppointmentListVM : AbstractDCListMapperVM<SchedulerAppointmentDC, SchedulingAppointmentVM>
{
#region Filtereinstellungen
private bool _IsAbsenceTimeVisible;
public bool IsAbsenceTimeVisible
{
get => _IsAbsenceTimeVisible;
set
{
_IsAbsenceTimeVisible = value;
FirePropertyChanged(nameof(IsAbsenceTimeVisible));
}
}
private bool _IsTasksVisible;
public bool IsTasksVisible
{
get => _IsTasksVisible;
set
{
_IsTasksVisible = value;
FirePropertyChanged(nameof(IsTasksVisible));
}
}
private bool _OnlyPrivateAppointments;
public bool OnlyPrivateAppointments
{
get => _OnlyPrivateAppointments;
set
{
_OnlyPrivateAppointments = value;
FirePropertyChanged(nameof(OnlyPrivateAppointments));
}
}
public bool ZeigeNurMeineTermine
{
get => BeWoApp.AppSettings.ZeigeNurMeineTermine;
set
{
if(BeWoApp.AppSettings.ZeigeNurMeineTermine != value)
{
BeWoApp.AppSettings.ZeigeNurMeineTermine = value;
BeWoApp.SaveAppSettings();
FirePropertyChanged(nameof(ZeigeNurMeineTermine));
}
}
}
#endregion Filtereinstellungen
private int _SelectedTabItemIndex;
public int SelectedTabItemIndex
{
get => _SelectedTabItemIndex;
set
{
_SelectedTabItemIndex = value;
FirePropertyChanged(nameof(SelectedTabItemIndex));
}
}
public bool DisableUpdateRequestString = false;
private string _Requests;
public string Requests
{
get => _Requests ?? (_Requests = "keine Benachrichtigung");
set
{
if(AreDifferent(_Requests, value))
{
_Requests = value ?? string.Empty;
FirePropertyChanged(nameof(Requests));
}
}
}
private bool _IsEmployeeBrushVisible;
public bool IsEmployeeBrushVisible
{
get => _IsEmployeeBrushVisible;
set
{
_IsEmployeeBrushVisible = value;
FirePropertyChanged(nameof(IsEmployeeBrushVisible));
}
}
public bool IsInCustomerViewMode { get; set; }
public ObservableCollection<ResourceDC> AllResources
{
get
{
if(Categories2Resources?.Any() ?? false)
{
var result = new ObservableCollection<ResourceDC>();
foreach(var cat2Res in Categories2Resources)
{
foreach(var res in cat2Res.Value)
{
result.AddIfNotIn(res.DataContract);
}
}
return result;
}
return new ObservableCollection<ResourceDC>();
}
}
private ObservableSortCollection<EmployeeDependencyObject> _FilteredEmployees;
/// <summary>
/// Die nach Suchtext gefilterten Mitarbeiter
/// </summary>
public ObservableSortCollection<EmployeeDependencyObject> FilteredEmployees
{
get => _FilteredEmployees ?? (_FilteredEmployees = new ObservableSortCollection<EmployeeDependencyObject>(Employees));
set
{
if(!ICollectionExtensions.ListEquals(_FilteredEmployees, value))
{
_FilteredEmployees = value;
_FilteredEmployees.Sort((x, y) => string.Compare(x.Employee.LastName + ", " + x.Employee.FirstName, y.Employee.LastName + ", " + y.Employee.FirstName, StringComparison.Ordinal));
FirePropertyChanged(nameof(FilteredEmployees));
}
}
}
private ObservableSortCollection<CompactCustomerDC> _FilteredCustomers;
/// <summary>
/// Die nach Suchtext gefilterten Klienten
/// </summary>
public ObservableSortCollection<CompactCustomerDC> FilteredCustomers
{
get => _FilteredCustomers ?? (_FilteredCustomers = new ObservableSortCollection<CompactCustomerDC>(AllCustomers));
set
{
if(!ICollectionExtensions.ListEquals(_FilteredCustomers, value))
{
_FilteredCustomers = value;
_FilteredCustomers.Sort((x, y) => string.Compare(x.LastName + ", " + x.FirstName, y.LastName + ", " + y.FirstName, StringComparison.Ordinal));
FirePropertyChanged(nameof(FilteredCustomers));
}
}
}
private ObservableSortCollection<CompactCustomerDC> _CustomerList;
public ObservableSortCollection<CompactCustomerDC> CustomerList
{
get => _CustomerList ?? (_CustomerList = new ObservableSortCollection<CompactCustomerDC>());
set
{
if(!ICollectionExtensions.ListEquals(_CustomerList, value))
{
_CustomerList = value;
_CustomerList.Sort((x, y) => string.Compare(x.LastName + ", " + x.FirstName, y.LastName + ", " + y.FirstName, StringComparison.Ordinal));
FirePropertyChanged(nameof(CustomerList));
}
}
}
private List<CompactEmployeeDC> _SelectedEmployees = new List<CompactEmployeeDC>();
public List<CompactEmployeeDC> SelectedEmployees
{
get => _SelectedEmployees;
set
{
if(!ICollectionExtensions.ListEquals(_SelectedEmployees, value))
{
_SelectedEmployees = value;
_SelectedEmployees.Sort((x, y) => string.Compare(x.LastName + ", " + x.FirstName, y.LastName + ", " + y.FirstName, StringComparison.Ordinal));
AllEmployeesCheckBoxIsChecked = ICollectionExtensions.ListEquals(value, AllEmployees);
ZeigeNurMeineTermine = value.Count == 1 && value.Contains(BeWoApp.CompactLoggedOnEmployee);
UpdateSelectedItems();
}
}
}
private List<CompactCustomerDC> _SelectedCustomers = new List<CompactCustomerDC>();
public List<CompactCustomerDC> SelectedCustomers
{
get => _SelectedCustomers;
set
{
if(!ICollectionExtensions.ListEquals(_SelectedCustomers, value))
{
_SelectedCustomers = value;
_SelectedCustomers.Sort((x, y) => string.Compare(x.LastName + ", " + x.FirstName, y.LastName + ", " + y.FirstName, StringComparison.Ordinal));
if(OnlyMyCustomersCheckBoxIsChecked || ICollectionExtensions.ListEquals(AllCustomers, value))
{
AllCustomersCheckBoxIsChecked = true;
}
UpdateSelectedItems();
}
}
}
private List<ResourceDC> _SelectedResources = new List<ResourceDC>();
public List<ResourceDC> SelectedResources
{
get => _SelectedResources;
set
{
if(!ICollectionExtensions.ListEquals(_SelectedResources, value))
{
_SelectedResources = value;
AllResourcesCheckBoxChecked = ICollectionExtensions.ListEquals(value, AllResources);
UpdateSelectedItems();
}
}
}
private bool _AllEmployeesCheckBoxIsChecked;
public bool AllEmployeesCheckBoxIsChecked
{
get => _AllEmployeesCheckBoxIsChecked;
set
{
_AllEmployeesCheckBoxIsChecked = value;
FirePropertyChanged(nameof(AllEmployeesCheckBoxIsChecked));
UpdateSelectedItems();
}
}
private bool _OnlyMyCustomersCheckBoxIsChecked;
public bool OnlyMyCustomersCheckBoxIsChecked
{
get => _OnlyMyCustomersCheckBoxIsChecked;
set
{
if(AreDifferent(_OnlyMyCustomersCheckBoxIsChecked, value))
{
_OnlyMyCustomersCheckBoxIsChecked = value;
FilterCustomers();
SelectedCustomers.Clear();
SelectedCustomers = FilteredCustomers.ToList();
FirePropertyChanged(nameof(OnlyMyCustomersCheckBoxIsChecked));
UpdateSelectedItems();
}
}
}
private bool _AllCustomersCheckBoxIsChecked;
public bool AllCustomersCheckBoxIsChecked
{
get => _AllCustomersCheckBoxIsChecked;
set
{
_AllCustomersCheckBoxIsChecked = value;
FirePropertyChanged(nameof(AllCustomersCheckBoxIsChecked));
UpdateSelectedItems();
}
}
private bool _AllResourcesCheckBoxChecked;
public bool AllResourcesCheckBoxChecked
{
get => _AllResourcesCheckBoxChecked;
set
{
_AllResourcesCheckBoxChecked = value;
FirePropertyChanged(nameof(AllResourcesCheckBoxChecked));
UpdateSelectedItems();
}
}
public ObservableCollection<IDataContract> SelectedItems
{
get
{
var selectedItems = new ObservableCollection<IDataContract>();
selectedItems.AddRange(SelectedEmployees);
selectedItems.AddRange(SelectedCustomers);
selectedItems.AddRange(SelectedResources);
return selectedItems;
}
}
public IEnumerable<IDataContract> AllItems
{
get
{
var allItems = new List<IDataContract>();
allItems.AddRange(FilteredEmployees.Select(s => s.Employee));
allItems.AddRange((IEnumerable<IDataContract>)FilteredCustomers);
allItems.AddRange(AllResources);
return allItems;
}
}
public Visibility EmployeeControlsVisibility => BeWoApp.LoggedOnUser.HasRight(UserRightType.KalenderMitarbeitertermineAnsehen) ? Visibility.Visible : Visibility.Collapsed;
public Visibility ResourceControlsVisibility => BeWoApp.LoggedOnUser.HasRight(UserRightType.KalenderRessourcentermineAnsehen) ? Visibility.Visible : Visibility.Collapsed;
public Visibility CustomerControlsVisibility => BeWoApp.LoggedOnUser.HasRight(UserRightType.CustomerView_View) || BeWoApp.LoggedOnUser.HasRight(UserRightType.Customer_ViewMyTeams) || BeWoApp.LoggedOnUser.HasRight(UserRightType.Customer_ViewMyCustomers) || BeWoApp.LoggedOnUser.HasRight(UserRightType.ViewAll) ? Visibility.Visible : Visibility.Collapsed;
public Visibility SelectionControlVisibility => EmployeeControlsVisibility == Visibility.Visible || ResourceControlsVisibility == Visibility.Visible || CustomerControlsVisibility == Visibility.Visible ? Visibility.Visible : Visibility.Collapsed;
public Visibility DeleteInInvervalButtonVisibility => BeWoApp.LoggedOnUser.HasRight(UserRightType.Termine_IntervalDelete) ? Visibility.Visible : Visibility.Collapsed;
private DateTimeRange _Interval;
public DateTimeRange Interval
{
get => _Interval;
set
{
if(AreDifferent(_Interval, value))
{
_Interval = value;
FirePropertyChanged(nameof(Interval));
}
}
}
public void ReloadRights()
{
FirePropertyChanged(nameof(EmployeeControlsVisibility));
FirePropertyChanged(nameof(ResourceControlsVisibility));
FirePropertyChanged(nameof(CustomerControlsVisibility));
FirePropertyChanged(nameof(SelectionControlVisibility));
FirePropertyChanged(nameof(DeleteInInvervalButtonVisibility));
}
public bool ShouldLockOverlappingAppointmentCheck { get; set; }
private ObservableSortCollection<CompactCustomerDC> _AllCustomers;
public ObservableSortCollection<CompactCustomerDC> AllCustomers
{
get => _AllCustomers ?? (_AllCustomers = new ObservableSortCollection<CompactCustomerDC>());
set
{
if(AreDifferent(_AllCustomers, value))
{
_AllCustomers = value;
FilterCustomers();
FirePropertyChanged(nameof(AllCustomers));
}
}
}
private ObservableSortCollection<CompactEmployeeDC> _AllEmployees;
public ObservableSortCollection<CompactEmployeeDC> AllEmployees
{
get => _AllEmployees ?? (_AllEmployees = new ObservableSortCollection<CompactEmployeeDC>());
set
{
if(AreDifferent(_AllEmployees, value))
{
_AllEmployees = value;
FirePropertyChanged(nameof(AllEmployees));
}
}
}
public ObservableCollection<SchedulingAppointmentVM> SelectedAppointments { get; set; }
private ObservableDictionary<CategoryDependencyObject, List<ResourceDependencyObject>> _Categories2Resources;
public ObservableDictionary<CategoryDependencyObject, List<ResourceDependencyObject>> Categories2Resources
{
get => _Categories2Resources ?? (_Categories2Resources = new ObservableDictionary<CategoryDependencyObject, List<ResourceDependencyObject>>());
set
{
if(!SchedulingUtils.Utils.Categories2ResourcesEquals(_Categories2Resources, value))
{
_Categories2Resources = value;
FirePropertyChanged(nameof(Categories2Resources));
}
}
}
public List<CompactCustomerDC> OwnCustomers { get; }
public SchedulingAppointmentListVM()
{
Categories2Resources = new ObservableDictionary<CategoryDependencyObject, List<ResourceDependencyObject>>();
AllCustomers = new ObservableSortCollection<CompactCustomerDC>();
AllEmployees = new ObservableSortCollection<CompactEmployeeDC>();
SelectedAppointments = new ObservableCollection<SchedulingAppointmentVM>();
OwnCustomers = BeWoApp.LoggedOnEmployee.RelatedCustomers.Select(s => s.Customer).ToList();
UpdateSelectedItems();
InitViewModel();
}
public void AddAbsenceTimes(List<AbsenceTimeDC> absenceTimes, DateTime intervalEnd)
{
foreach(var absenceTime in absenceTimes.Where(w => w.Start != null))
{
var subject = absenceTime.Reason.Description;
var employee = absenceTime.EmployeeOid != null ? AllEmployees.FirstOrDefault(e => e.EmployeeOid == absenceTime.EmployeeOid.Value) : null;
if(employee != null)
{
subject += $" ({employee.SimpleDescription})";
}
var absenceTimeEnd = absenceTime.End?.AddTicks(1);
VMList.Add(new SchedulingAppointmentVM(true, subject, absenceTime.Start.Value, absenceTime.End ?? intervalEnd, employee, absenceTime.Start, absenceTimeEnd));
}
}
private bool _Enabled;
public bool Enabled
{
get => _Enabled;
set
{
_Enabled = value;
FirePropertyChanged(nameof(Enabled));
}
}
private void InitViewModel()
{
foreach(var item in VMList)
{
item.Id = item.DataContract.SchedulerAppointmentOid;
if(!item.IsPrivate || item.Originator.EmployeeOid.Equals(BeWoApp.LoggedOnEmployee.EmployeeOid) || item.EmployeeList.Select(s => s.Employee).Contains(BeWoApp.CompactLoggedOnEmployee))
{
continue;
}
item.Description = "Privater Termin";
item.Subject = $"Privat ({item.Originator})";
}
}
private ObservableCollection<SchedulerAppointmentDC> _OpenAppointments;
public ObservableCollection<SchedulerAppointmentDC> OpenAppointments
{
get => _OpenAppointments;
set
{
if(AreDifferent(_OpenAppointments, value))
{
_OpenAppointments = value;
FirePropertyChanged(nameof(OpenAppointments));
}
}
}
public void FilterCustomers()
{
FilteredCustomers.Clear();
var customersToAdd = OnlyMyCustomersCheckBoxIsChecked ? AllCustomers.Where(customer => customer.IsRelatedToEmployee) : AllCustomers;
FilteredCustomers.AddRange(customersToAdd);
}
public void UpdateSelectedItems()
{
FirePropertyChanged(nameof(SelectedItems));
FirePropertyChanged(nameof(SelectedEmployees));
FirePropertyChanged(nameof(SelectedCustomers));
FirePropertyChanged(nameof(SelectedResources));
FirePropertyChanged(nameof(VMList));
FirePropertyChanged(nameof(Categories2Resources));
FirePropertyChanged(nameof(FilteredEmployees));
FirePropertyChanged(nameof(Employees));
FirePropertyChanged(nameof(AllEmployeesCheckBoxIsChecked));
}
public void UpdateEmployeeSelection()
{
AllEmployeesCheckBoxIsChecked = SelectedEmployees.Count == AllEmployees.Count;
}
public void UpdateEmployeeSelection2()
{
SelectedEmployees = GetSelectedEmployees();
FirePropertyChanged(nameof(Employees));
AllEmployeesCheckBoxIsChecked = SelectedEmployees.Count == AllEmployees.Count;
}
public void UpdateCustomerSelection()
{
AllCustomersCheckBoxIsChecked = SelectedCustomers.Count == AllCustomers.Count;
}
public void UpdateResourceSelection()
{
SelectedResources = new List<ResourceDC>(GetSelectedResources());
FirePropertyChanged(nameof(Categories2Resources));
AllResourcesCheckBoxChecked = SelectedResources.Count == AllResources.Count;
}
public void FilterEmployees(string searchText)
{
FilteredEmployees.Clear();
FilteredEmployees.AddRangeIfElementsNotIn(
Employees.Where(employeeDependencyObject => employeeDependencyObject.Employee.FirstName.ToLower().Contains(searchText.ToLower()) ||
employeeDependencyObject.Employee.LastName.ToLower().Contains(searchText.ToLower())
));
}
public void FilterCustomers(string searchText)
{
FilteredCustomers.Clear();
FilteredCustomers.AddRangeIfElementsNotIn(AllCustomers.Where(customer => customer.FirstName.ToLower().Contains(searchText.ToLower()) || customer.LastName.ToLower().Contains(searchText.ToLower())));
}
private IEnumerable<ResourceDC> GetSelectedResources()
{
var result = new List<ResourceDC>();
foreach(var cat2Res in Categories2Resources)
{
foreach(var resource in cat2Res.Value)
{
if(resource.GetValue(TreeViewItemHelper.IsCheckedProperty) is bool value && value)
{
result.AddIfNotIn(resource.DataContract);
}
}
}
return result;
}
public void DeselectResource(long oid)
{
foreach(var cat2Res in Categories2Resources)
{
foreach(var resource in cat2Res.Value)
{
if(resource.DataContract.ResourceOid.HasValue && resource.DataContract.ResourceOid.Value == oid)
{
resource.SetValue(TreeViewItemHelper.IsCheckedProperty, false);
}
}
}
}
public void DeselectAllResources()
{
foreach(var cat2Res in Categories2Resources)
{
foreach(var resource in cat2Res.Value)
{
resource.SetValue(TreeViewItemHelper.IsCheckedProperty, false);
}
}
SelectedResources.Clear();
}
public void SelectAllResources()
{
foreach(var cat2Res in Categories2Resources)
{
foreach(var resource in cat2Res.Value)
{
resource.SetValue(TreeViewItemHelper.IsCheckedProperty, true);
}
}
UpdateResourceSelection();
}
private ObservableSortCollection<EmployeeDependencyObject> _Employees;
public ObservableSortCollection<EmployeeDependencyObject> Employees
{
get => _Employees ?? (_Employees = new ObservableSortCollection<EmployeeDependencyObject>());
set
{
if(AreDifferent(_Employees, value))
{
_Employees = value;
FirePropertyChanged(nameof(Employees));
}
}
}
private List<CompactEmployeeDC> GetSelectedEmployees()
{
var result = new List<CompactEmployeeDC>();
foreach(var employee in Employees)
{
if(employee.GetValue(ListItemHelper.IsCheckedProperty) is bool isChecked && isChecked)
{
result.AddIfNotIn(employee.Employee);
}
}
return result;
}
public void DeselectEmployee(long oid)
{
foreach(var employeeDependencyObject in Employees)
{
if(employeeDependencyObject.Employee.EmployeeOid == oid)
{
employeeDependencyObject.SetValue(ListItemHelper.IsCheckedProperty, false);
}
}
}
public void DeselectAllEmployees()
{
foreach(var employeeDependencyObject in Employees)
{
employeeDependencyObject.SetValue(ListItemHelper.IsCheckedProperty, false);
}
SelectedEmployees.Clear();
}
public void SelectAllEmployees()
{
foreach(var employeeDependencyObject in Employees)
{
employeeDependencyObject.SetValue(ListItemHelper.IsCheckedProperty, true);
}
}
public void SelectEmployeesAfterReload()
{
foreach(var employeeDependencyObject in Employees)
{
var val = SelectedEmployees.Any(employee => employee.EmployeeOid == employeeDependencyObject.Employee.EmployeeOid);
employeeDependencyObject.SetValue(ListItemHelper.IsCheckedProperty, val);
}
}
public List<long> TeamRelatedCustomerOids { get; set; } = new List<long>();
}
}