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 _Categories; public List Categories { get { return _Categories; } set { _Categories = value; OnPropertyChanged("Categories"); } } private List _ResourceList; public List 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 selectedResources; public ObservableCollection SelectedResources { get { return selectedResources ?? (selectedResources = new ObservableCollection(NewSchedulerAppointmentFormController.ResourceList ?? new List())); } set { selectedResources = value; SelectedResources.CollectionChanged += SelectedResourcesCollectionChanged; NewSchedulerAppointmentFormController.ResourceList = value.ToList(); OnPropertyChanged("SelectedResources"); } } private ObservableCollection selectedEmployees; public ObservableCollection SelectedEmployees { get { return selectedEmployees ?? (selectedEmployees = new ObservableCollection(NewSchedulerAppointmentFormController.EmployeeList ?? new List())); } set { if (selectedEmployees.Equals(value)) return; selectedEmployees = value; SelectedEmployees.CollectionChanged += SelectedEmployeesCollectionChanged; NewSchedulerAppointmentFormController.EmployeeList = value.ToList(); OnPropertyChanged("SelectedEmployees"); } } private ObservableCollection selectedCustomers; public ObservableCollection SelectedCustomers { get { var newList = new ObservableCollection(NewSchedulerAppointmentFormController.CustomerList ?? new List()); 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 employees, IEnumerable customers, Dictionary> 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(); var customerOids = new List(); 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) { //###Lyndon testen!!! ViewModel.ApplyChangesToChangedOccurencyCustomFields(employees, customers, resources, originator, isPrivate, Appointment.RecurrenceIndex.ToString(), new Guid(Appointment.RecurrenceInfo.Id.ToString())); //ViewModel.ApplyChangesToChangedOccurencyCustomFields(employees, customers, resources, originator, isPrivate, Appointment.RecurrenceIndex.ToString(), Appointment.RecurrenceInfo.Id); } if (Appointment.IsOccurrence && item == null) { ((List)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 customerlist = new List(); List employeelist = new List(); 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 SourceResourceList { get { return (List)SourceAppointment.CustomFields["ResourceList"]; } set { SourceAppointment.CustomFields["ResourceList"] = value; } } public List ResourceList { get { return (List)EditedAppointmentCopy.CustomFields["ResourceList"]; } set { EditedAppointmentCopy.CustomFields["ResourceList"] = value; } } List SourceEmployeeList { get { return (List)SourceAppointment.CustomFields["EmployeeList"]; } set { SourceAppointment.CustomFields["EmployeeList"] = value; } } public List EmployeeList { get { return (List)EditedAppointmentCopy.CustomFields["EmployeeList"]; } set { EditedAppointmentCopy.CustomFields["EmployeeList"] = value; } } List SourceCustomerList { get { return (List)SourceAppointment.CustomFields["CustomerList"]; } set { SourceAppointment.CustomFields["CustomerList"] = value; } } public List CustomerList { get { return (List)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; } } }