Files
BeWoPlaner/BeWo/Scheduler/View/SchedulerAppointmentEditForm.xaml.cs
2017-04-12 10:55:32 +02:00

535 lines
20 KiB
C#

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Collections.Specialized;
using System.ComponentModel;
using System.Globalization;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using BeWo.Annotations;
using BeWo.Core;
using BeWo.Scheduler.ViewModel;
using BeWo.ServiceProxy;
using BeWo.View;
using BeWo.View.Search;
using BS.Shared;
using BS.Shared.DataContracts;
using BS.Shared.DataContracts.Compact;
using BS.Shared.Extensions;
using DevExpress.Xpf.Editors;
using DevExpress.Xpf.Scheduler.Drawing;
using DevExpress.Xpf.Scheduler.UI;
using DevExpress.XtraScheduler;
using SchedulerControl = DevExpress.Xpf.Scheduler.SchedulerControl;
namespace BeWo.Scheduler.View
{
public partial class SchedulerAppointmentEditForm : INotifyPropertyChanged
{
public bool IsInCustomerViewMode { get; set; }
private List<ValueListEntryDC> _Categories;
public List<ValueListEntryDC> Categories
{
get { return _Categories; }
set { _Categories = value; OnPropertyChanged("Categories"); }
}
private List<ResourceDC> _ResourceList;
public List<ResourceDC> ResourceList
{
get { return _ResourceList; }
set { _ResourceList = value; OnPropertyChanged("ResourceList"); }
}
public SchedulerAppointmentListVM ViewModel { get; set; }
private static void recurrenceControl_Loaded(object sender, RoutedEventArgs e)
{
LocalizeVisualChild(sender as DependencyObject);
}
public NewSchedulerAppointmentFormController NewSchedulerAppointmentFormController { get { return Controller as NewSchedulerAppointmentFormController; } }
private ObservableCollection<ResourceDC> selectedResources;
public ObservableCollection<ResourceDC> SelectedResources
{
get { return selectedResources ?? (selectedResources = new ObservableCollection<ResourceDC>(NewSchedulerAppointmentFormController.ResourceList ?? new List<ResourceDC>())); }
set
{
selectedResources = value;
SelectedResources.CollectionChanged += SelectedResourcesCollectionChanged;
NewSchedulerAppointmentFormController.ResourceList = value.ToList();
OnPropertyChanged("SelectedResources");
}
}
private ObservableCollection<Employee2SchedulerAppointmentDC> selectedEmployees;
public ObservableCollection<Employee2SchedulerAppointmentDC> SelectedEmployees
{
get { return selectedEmployees ?? (selectedEmployees = new ObservableCollection<Employee2SchedulerAppointmentDC>(NewSchedulerAppointmentFormController.EmployeeList ?? new List<Employee2SchedulerAppointmentDC>())); }
set
{
if (selectedEmployees.Equals(value)) return;
selectedEmployees = value;
SelectedEmployees.CollectionChanged += SelectedEmployeesCollectionChanged;
NewSchedulerAppointmentFormController.EmployeeList = value.ToList();
OnPropertyChanged("SelectedEmployees");
}
}
private ObservableCollection<CompactCustomerDC> selectedCustomers;
public ObservableCollection<CompactCustomerDC> SelectedCustomers
{
get
{
var newList = new ObservableCollection<CompactCustomerDC>(NewSchedulerAppointmentFormController.CustomerList ?? new List<CompactCustomerDC>());
return selectedCustomers ?? (selectedCustomers = newList);
}
set
{
if (selectedCustomers.Equals(value)) return;
selectedCustomers = value;
SelectedCustomers.CollectionChanged += SelectedCustomersCollectionChanged;
NewSchedulerAppointmentFormController.CustomerList = value.ToList();
OnPropertyChanged("SelectedCustomers");
}
}
public SchedulerAppointmentEditForm(SchedulerAppointmentListVM vm, SchedulerControl schedulerControl, Appointment appointment,
IEnumerable<CompactEmployeeDC> employees, IEnumerable<CompactCustomerDC> customers, Dictionary<ValueListEntryDC, List<ResourceDC>> categoriesToResources)
: base(schedulerControl, appointment)
{
ViewModel = vm;
InitializeComponent();
EdtRecurrenceType.Visibility = ShouldShowRecurrence ? Visibility.Visible : Visibility.Collapsed;
SelectedResources.CollectionChanged += SelectedResourcesCollectionChanged;
SelectedCustomers.CollectionChanged += SelectedCustomersCollectionChanged;
SelectedEmployees.CollectionChanged += SelectedEmployeesCollectionChanged;
DataContext = this;
Categories = categoriesToResources.Keys.ToList();
if (categoriesToResources.Count > 0)
{
ResourceList = categoriesToResources.First().Value;
}
MonthlyRecurrenceControl.Loaded += recurrenceControl_Loaded;
YearlyRecurrenceControl.Loaded += recurrenceControl_Loaded;
ResourcesTreeSearchView.Sauce = categoriesToResources;
ResourcesTreeSearchView.AusgewaehlteRessourcen = SelectedResources.ToList();
ResourcesTreeSearchView.CommandBindings.Add(new CommandBinding(ApplicationCommands.Close, (s, e) => this.Dispatch(() => { PopupResource.IsOpen = false; })));
MultiEmployeeSearch.Sauce = employees.ToObservableCollection();
MultiEmployeeSearch.AusgewaehlteMitarbeiter = SelectedEmployees.Select(e=>e.Employee).ToList();
MultiEmployeeSearch.CommandBindings.Add(new CommandBinding(ApplicationCommands.Close, (s, e) => this.Dispatch(() => { PopupEmployee.IsOpen = false; })));
MultiCustomerSearch.Sauce = customers.ToObservableCollection();
MultiCustomerSearch.AusgewaehlteKlienten = SelectedCustomers.ToList();
MultiCustomerSearch.CommandBindings.Add(new CommandBinding(ApplicationCommands.Close, (s, e) => this.Dispatch(() => { PopupCustomer.IsOpen = false; })));
EdtRecurrenceType.CustomDisplayText += edtRecurrenceType_CustomDisplayText;
InitRights();
}
private void InitRights()
{
if (!BeWoApp.LoggedOnUser.HasRight(UserRightType.KalenderMitarbeitertermineAnlegen))
MitarbeiterPopUpOeffnenBtn.Visibility = Visibility.Collapsed;
if (!BeWoApp.LoggedOnUser.HasRight(UserRightType.KalenderKliententermineAnlegen))
KlientenPopUpOeffnenBtn.Visibility = Visibility.Collapsed;
if (!BeWoApp.LoggedOnUser.HasRight(UserRightType.KalenderRessourcentermineAnlegen))
RessourcenPopUpOeffnenBtn.Visibility = Visibility.Collapsed;
var m = SelectedEmployees;
var k = SelectedCustomers;
var r = SelectedResources;
var allowedToChange = true;
if (!NewSchedulerAppointmentFormController.Originator.EmployeeOid.Equals(BeWoApp.LoggedOnEmployee.EmployeeOid))
{
if (m.Count > 0 && !BeWoApp.LoggedOnUser.HasRight(UserRightType.KalenderMitarbeitertermineAendern))
allowedToChange = false;
if (k.Count > 0 && !BeWoApp.LoggedOnUser.HasRight(UserRightType.KalenderKliententermineAendern))
allowedToChange = false;
if (r.Count > 0 && !BeWoApp.LoggedOnUser.HasRight(UserRightType.KalenderRessourcentermineAendern))
allowedToChange = false;
}
if (allowedToChange)
return;
OKButton.Visibility = Visibility.Hidden;
DeleteButton.Visibility = Visibility.Hidden;
}
private static void edtRecurrenceType_CustomDisplayText(object sender, CustomDisplayTextEventArgs e)
{
var conv = new Converter.Recurrence2GermanConverter();
e.DisplayText = (string) conv.Convert(e.EditValue, typeof (string), null, null);
e.Handled = true;
}
public string CountSelectedEmployees
{
get { return string.Format("{0} Mitarbeiter ausgewählt", SelectedEmployees.Count); }
}
public string CountSelectedResources
{
get { return string.Format("{0} Resourcen ausgewählt", SelectedResources.Count); }
}
public string CountSelectedCustomers
{
get { return string.Format("{0} Klienten ausgewählt", SelectedCustomers.Count); }
}
public override AppointmentFormController CreateFormController(SchedulerControl schedulerControl, Appointment appointment)
{
return new NewSchedulerAppointmentFormController(schedulerControl, appointment);
}
private void SelectedCustomersCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
NewSchedulerAppointmentFormController.CustomerList = SelectedCustomers.ToList();
MultiCustomerSearch.AusgewaehlteKlienten = SelectedCustomers.ToList();
}
private void SelectedResourcesCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
NewSchedulerAppointmentFormController.ResourceList = SelectedResources.ToList();
ResourcesTreeSearchView.AusgewaehlteRessourcen = SelectedResources.ToList();
}
private void SelectedEmployeesCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
NewSchedulerAppointmentFormController.EmployeeList = SelectedEmployees.ToList();
MultiEmployeeSearch.AusgewaehlteMitarbeiter = SelectedEmployees.Select(em => em.Employee).ToList();
}
public event PropertyChangedEventHandler PropertyChanged;
[NotifyPropertyChangedInvocator]
protected void OnPropertyChanged(string propertyName)
{
var handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}
private void popupedit_employee_PopUpClick(object sender, RoutedEventArgs e)
{
PopupEmployee.IsOpen = true;
}
private void popupedit_customer_PopUpClick(object sender, RoutedEventArgs e)
{
ResourcesTreeSearchView.AusgewaehlteRessourcen = selectedResources.ToList();
PopupCustomer.IsOpen = true;
}
private void popupedit_resource_PopUpClick(object sender, RoutedEventArgs e)
{
PopupResource.IsOpen = true;
}
private void button_ok_Click(object sender, RoutedEventArgs e)
{
try
{
ViewModel.NewVM.EmployeeList = NewSchedulerAppointmentFormController.EmployeeList;
var employees = NewSchedulerAppointmentFormController.EmployeeList;
var customers = NewSchedulerAppointmentFormController.CustomerList;
var resources = NewSchedulerAppointmentFormController.ResourceList;
var originator = NewSchedulerAppointmentFormController.Originator;
var isPrivate = NewSchedulerAppointmentFormController.IsPrivate;
ViewModel.NewVM.AllDay = !Appointment.AllDay;
ViewModel.NewVM.IsPrivate = isPrivate;
ViewModel.NewVM.ResourceList = resources;
ViewModel.NewVM.CustomerList = customers;
ViewModel.NewVM.Originator = originator;
NewSchedulerView.IgnoreChangeEvents = true;
Appointment.CustomFields["IsPrivate"] = isPrivate;
Appointment.CustomFields["ResourceList"] = resources;
Appointment.CustomFields["CustomerList"] = customers;
Appointment.CustomFields["Originator"] = originator;
Appointment.CustomFields["EmployeeList"] = employees;
NewSchedulerView.IgnoreChangeEvents = false;
// Änderung an den CustomFields lösen das NewSchedulerStorage_AppointmentsChanged-Event aus
var employeeOids = new List<long>();
var customerOids = new List<long>();
var overlaps = false;
foreach (var emp in employees)
{
employeeOids.AddIfNotIn(emp.Employee.EmployeeOid);
}
foreach (var customer in customers)
{
customerOids.AddIfNotIn(customer.CustomerOid);
}
var item = (SchedulerAppointmentVM) Appointment.GetSourceObject(Control.GetCoreStorage());
ServiceFacade.DoResourceServiceSync(definedBelow => overlaps = definedBelow.OverlappingAppointmentsExist(Appointment.Start, Appointment.End, employeeOids, customerOids, resources.Select(res => res.ResourceOid.Value).ToList(), ViewModel.NewVM.Originator.EmployeeOid, (item != null ? item.CommitToDataContract().SchedulerAppointmentOid : null), String.Empty, Appointment.RecurrenceIndex));
if (overlaps)
{
var erg = MessageBox.Show("Dieser Termin überschneidet sich mit einem anderen bereits existierenden Termin.\n Möchten Sie ihn wirklich speichern?", "Überschneidung", MessageBoxButton.YesNo, MessageBoxImage.Exclamation);
if (erg.Equals(MessageBoxResult.No))
{
return;
}
}
ViewModel.ShouldLockOverlappingAppointmentCheck = true;
if (Appointment.RecurrenceInfo != null)
{
ViewModel.ApplyChangesToChangedOccurencyCustomFields(employees, customers, resources, originator, isPrivate, Appointment.RecurrenceIndex.ToString(), Appointment.RecurrenceInfo.Id);
}
if (Appointment.IsOccurrence && item == null)
{
((List<Employee2SchedulerAppointmentDC>)Appointment.CustomFields["EmployeeList"]).ForEach(each =>
{
each.Employee2SchedulerAppointmentOid = null;
each.Employee2SchedulerAppointmentVersion = null;
each.SchedulerAppointmentOid = null;
each.IsPChanged = false;
each.IsPC_CheckedTs = null;
});
}
ApplyChanges();
ViewModel.ShouldLockOverlappingAppointmentCheck = false;
}
catch (Exception exception)
{
MessageBox.Show(exception.Message + "\n" + exception.StackTrace);
}
}
private void button_cancel_Click(object sender, RoutedEventArgs e)
{
Cancel();
}
private void button_delete_Click(object sender, RoutedEventArgs e)
{
DeleteAppointment();
}
private void Button_CreatZeiterfassung_Click(object sender, RoutedEventArgs e)
{
var employ = SelectedMitarbeiter.Items;
var y = SelectedKlient.Items;
if (y.Count == 0)
{
MessageBox.Show("Bitte wählen Sie mindestens einen Klienten aus!");
}
else
{
var startDate = StartDate.DateTime;
var startTime = DateTime.Parse(StartTime.Text);
var endDate = EndDate.DateTime;
var endTime = DateTime.Parse(EndTime.Text);
DateTime start = new DateTime(startDate.Year, startDate.Month, startDate.Day, startTime.Hour, startTime.Minute, startTime.Second);
DateTime end = new DateTime(endDate.Year, endDate.Month, endDate.Day, endTime.Hour, endTime.Minute, endTime.Second);
List<CompactCustomerDC> customerlist = new List<CompactCustomerDC>();
List<CompactEmployeeDC> employeelist = new List<CompactEmployeeDC>();
foreach (var employee in employ)
{
var xy = (Employee2SchedulerAppointmentDC)employee;
employeelist.Add(xy.Employee);
}
foreach (var klient in y)
{
var s = (CompactCustomerDC)klient;
customerlist.Add(s);
}
BeWoUtils.CreateZeiterfassung(start, end, customerlist, employeelist, Notice.Text);
}
}
private void BtnRemoveElement_Click(object sender, RoutedEventArgs e)
{
var obj = ((Button) sender).Tag;
var res = obj as ResourceDC;
if (res != null)
{
SelectedResources.Remove(res);
OnPropertyChanged("CountSelectedResources");
}
var cus = obj as CompactCustomerDC;
if (cus != null)
{
SelectedCustomers.Remove(cus);
OnPropertyChanged("CountSelectedCustomers");
}
if (!(obj is Employee2SchedulerAppointmentDC)) return;
var emp = (Employee2SchedulerAppointmentDC) obj;
SelectedEmployees.Remove(emp);
OnPropertyChanged("CountSelectedEmployees");
}
private void ResourcesTreeSearchView_OnSelectionChanged(object sender, RoutedEventArgs e)
{
var resourcesTreeSearchView = (ResourcesTreeSearchView) e.Source;
var resOC = resourcesTreeSearchView.SelectedResources.ToObservableCollection();
foreach (var res in resOC.Where(res => !SelectedResources.Contains(res)))
SelectedResources.Add(res);
SelectedResources = SelectedResources.Except(SelectedResources.Where(sr => !resOC.Contains(sr)).ToList()).ToObservableCollection();
OnPropertyChanged("CountSelectedResources");
}
private void MultiEmployeeSearch_OnSelectionChanged(object sender, RoutedEventArgs e)
{
var multiEmployeeSearch = (MultiEmployeeSearch)e.Source;
var empOC = multiEmployeeSearch.SelectedEmployees.ToObservableCollection();
foreach (var emp in empOC.Where(emp => !SelectedEmployees.Any(se => se.Employee.Equals(emp))))
SelectedEmployees.Add(new Employee2SchedulerAppointmentDC { Employee = emp, ParticipationAnswer = ParticipationAnswer.Offen });
var ex = SelectedEmployees.Where(se => !empOC.Contains(se.Employee));
var ab = SelectedEmployees.Except(ex);
var cd = ab.ToObservableCollection();
SelectedEmployees = cd;
OnPropertyChanged("CountSelectedEmployees");
}
private void MultiCustomerSearch_OnSelectionChanged(object sender, RoutedEventArgs e)
{
var multiCustomerSearchView = (MultiCustomerSearchView)e.Source;
SelectedCustomers = multiCustomerSearchView.SelectedCustomers.ToObservableCollection();
OnPropertyChanged("CountSelectedCustomers");
}
}
public class NewSchedulerAppointmentFormController : AppointmentFormController
{
List<ResourceDC> SourceResourceList
{
get { return (List<ResourceDC>)SourceAppointment.CustomFields["ResourceList"]; }
set { SourceAppointment.CustomFields["ResourceList"] = value; }
}
public List<ResourceDC> ResourceList
{
get { return (List<ResourceDC>)EditedAppointmentCopy.CustomFields["ResourceList"]; }
set { EditedAppointmentCopy.CustomFields["ResourceList"] = value; }
}
List<Employee2SchedulerAppointmentDC> SourceEmployeeList
{
get { return (List<Employee2SchedulerAppointmentDC>)SourceAppointment.CustomFields["EmployeeList"]; }
set { SourceAppointment.CustomFields["EmployeeList"] = value; }
}
public List<Employee2SchedulerAppointmentDC> EmployeeList
{
get { return (List<Employee2SchedulerAppointmentDC>)EditedAppointmentCopy.CustomFields["EmployeeList"]; }
set { EditedAppointmentCopy.CustomFields["EmployeeList"] = value; }
}
List<CompactCustomerDC> SourceCustomerList
{
get { return (List<CompactCustomerDC>)SourceAppointment.CustomFields["CustomerList"]; }
set { SourceAppointment.CustomFields["CustomerList"] = value; }
}
public List<CompactCustomerDC> CustomerList
{
get { return (List<CompactCustomerDC>)EditedAppointmentCopy.CustomFields["CustomerList"]; }
set { EditedAppointmentCopy.CustomFields["CustomerList"] = value; }
}
CompactEmployeeDC SourceOriginator
{
get { return (CompactEmployeeDC)SourceAppointment.CustomFields["Originator"]; }
set { SourceAppointment.CustomFields["Originator"] = value; }
}
public CompactEmployeeDC Originator
{
get { return (CompactEmployeeDC)EditedAppointmentCopy.CustomFields["Originator"]; }
set { EditedAppointmentCopy.CustomFields["Originator"] = value; }
}
bool SourceIsPrivate
{
get { return (bool)SourceAppointment.CustomFields["IsPrivate"]; }
set { SourceAppointment.CustomFields["IsPrivate"] = value; }
}
public bool IsPrivate
{
get { return (bool)EditedAppointmentCopy.CustomFields["IsPrivate"]; }
set { EditedAppointmentCopy.CustomFields["IsPrivate"] = value; }
}
public override bool IsAppointmentChanged()
{
if (base.IsAppointmentChanged())
return true;
if (SourceResourceList != null && ResourceList != null ||
SourceEmployeeList != null && EmployeeList != null ||
SourceCustomerList != null && CustomerList != null ||
SourceOriginator != null && Originator != null)
return false;
var resourceListsAreEqual = SourceResourceList == null || ResourceList == null || !Equals(SourceResourceList, ResourceList);
var employeeListsAreEqual = SourceEmployeeList == null || EmployeeList == null || !Equals(SourceEmployeeList, EmployeeList);
var customerListsAreEqual = SourceCustomerList == null || CustomerList == null || !Equals(SourceCustomerList, CustomerList);
var originatorsAreEqual = SourceOriginator == null || Originator == null || !Equals(SourceOriginator, Originator);
var isPrivatesAreEqual = !Equals(SourceIsPrivate, IsPrivate);
return resourceListsAreEqual || employeeListsAreEqual || customerListsAreEqual || originatorsAreEqual || isPrivatesAreEqual;
}
public NewSchedulerAppointmentFormController(SchedulerControl control, Appointment apt) : base(control, apt) { }
protected override void ApplyCustomFieldsValues()
{
SourceResourceList = ResourceList;
SourceEmployeeList = EmployeeList;
SourceCustomerList = CustomerList;
SourceOriginator = Originator;
SourceIsPrivate = IsPrivate;
}
}
}